多くのパッケージのインストールを必要とするチュートリアルを読んでいると、バックスラッシュ\
行末ですか?
Sudo apt install gcc git pkg-config meson ninja-build \
libavcodec-dev libavformat-dev libavutil-dev \
libsdl2-dev
どうして?コマンドをLinuxターミナルにコピーアンドペーストすると、コマンドが機能せず、バックスラッシュを削除してすべてを1行に入力する必要があります。どうしたの?
行末の\
文字は、bashの行継続文字として解釈され、次の場合を除いて、bashに次の行でコマンドの継続を期待するように指示します。
\
文字は、単一引用符または二重引用符で囲まれた文字列の一部です\
文字は、この\\
のように別のバックスラッシュ文字をその前に置くことでエスケープされ、リテラル文字として解釈されます。注:引用符で囲まれていないバックスラッシュ\
は、bashのエスケープ文字としても使用されます。
以下の例のような複数行コマンドをテキストエディターからターミナルにコピー/貼り付けると、コマンドは単一行コマンドとして実行されます。
元のテキスト:
touch 1 \
2 \
3 \
&& ls
元のテキストをコピー/ターミナルに貼り付け:
ドル touch 1\ > 2\ > 3\ > && ls 1 2 3
次の複数行コマンドがテキストエディターからターミナルにコピー/貼り付けされると、バックスラッシュ文字が印刷されます。このコマンドでは、バックスラッシュはリテラルのバックスラッシュ文字として解釈されます。これは、1つの(単一の)引用文字で囲まれているためです。
元のテキスト:
echo 'This is \
a multiple line \
command.'
ターミナルで:
ドル echo 'これは\ >複数行\ >コマンドです。' これは\ 複数行\ コマンドです。
この回答のすべてのコマンドは、ターミナルに貼り付ける前にテキストエディターで最初に入力したため、コマンドが機能しない原因となる非表示の文字はありません。
バックスラッシュは、bashが行の継続を示すために使用し、bashスクリプトで一般的に使用されます。ただし、バックスラッシュは実際には bashエスケープ文字です。したがって、このバックスラッシュの使用は、継続を作成するために\ newlineを「エスケープ」します。クールで、知っておくと良いですよね?特に、GNU bashマニュアルのセクション3.1.2.1はこう述べています:
引用符で囲まれていないバックスラッシュ「\」は、Bashエスケープ文字です。改行を除いて、次の文字のリテラル値を保持します。\newlineペアが表示され、バックスラッシュ自体が引用されていない場合、\ newlineは行の継続として扱われます(つまり、入力ストリームから削除され、事実上無視されます)。
特定の質問に答えるには、作成者は、複数行の式が単一行のbashコマンドであることを単に示しています。この複数行式は、 '\'の後に文字がなく、\ newlineがある場合に機能します。ただし、切り取って貼り付けると、「\」の後にあらゆる種類の残骸(スペースなど)が表示される場合があります。したがって、これまでと同じように、「\」の後のすべての末尾の文字を削除するか、コマンドを1行に入力します。長いコマンドを入力するときに「\」を使用すると便利なことがよくありますが、それは個人的な好みの問題です。
\
はsh
/bash
の行継続文字であり、C(長いマクロを定義する場合)または他のいくつかのコンピューター言語と同様に、ソースで長い行をラップできます。行指向言語の意味を変えることなく。
単一の貼り付けで機能しますif選択範囲には\
文字の後にスペースが含まれず、改行のみが含まれます。 (Chromiumでは、これは行末のスペースのように見える1つの青い文字「ボックス」として表示されますが、明らかにそれは実際には改行です。)一部のWebページには、フォーマット済みコードの末尾にスペースが含まれています。おそらく、作成者は、スペースを含むターミナルから固定幅にコピー/ペーストし、コードブロック用にクリーンアップしませんでした。
全体を選択して行末を確認することで、これを視覚的に確認できます。よければ、ターミナルに貼り付けることができます。そうでない場合は、エディタに貼り付けて、\ ... spaces newline
を自分で折りたたむことができます。
または、too複雑でない場合は、コマンドラインで単一引用符内に貼り付け、上矢印を使用して修正できる場合があります。
または、[\...
を省略して各行を個別に貼り付け、長い行を1つ作成します。または、手動で\
を含めますが、コピーに末尾のスペースまたは改行をしないので、各行を貼り付けた後にReturnキーを押します。
Chromiumでは、マウスで必要なすべての文字を取得するのに問題があるができない場合、Shift +左/右矢印で選択を調整できます)不要な文字。
Stack Exchangeのコードフォーマットブロックは、良い例と悪い例の両方を忠実に再現できるため、ブラウザで試して、何を探すべきかを確認できます。
# Good:
echo 1 \
2 \
3
# Bad: spaces after backslash: needs editing to copy/paste
echo 1 \
2 \
3
結果の貼り付け:\
はスペースをエスケープするだけで、改行はエスケープしません。個々の線はそれ自体無害なので、いじってみても安全です。 rm *
または3`と呼ばれるエイリアスまたはシェル関数がない限り、他の何かの一部である、または実際のプログラムを開始する2
とは異なります。
peter@volta:/tmp$ echo 1 \
1
peter@volta:/tmp$ 2 \
bash: 2: command not found
peter@volta:/tmp$ 3
bash: 3: command not found
別のエディターを起動せずに修正する1つの簡単な方法:
一重引用符内に貼り付けます。
$ 'echo 1 \
> 2 \
> 3 '
bash: $'echo 1 \\ \n 2 \\ \n 3 ': command not found
Bashが$'C-escaped'
構文を使用してコマンドを引用していることに注意してください。実際にreturnを押して、すべてをコマンドラインの履歴に入れました。 Bashの行編集では、以前に送信された以前の行には戻りませんが、複数行で引用されたものは、単一の複数行の履歴エントリを作成します。
そこから上向きの矢印を押すと、編集可能な改行が埋め込まれた単一のコマンドとしてすべてが得られます。それらを削除する必要があります。そうしないと、;
セミコロンのように、複数のコマンドとして解釈されます。もちろん、'
の引用符も削除してください。
Ctrl-w(unix-Word-rubout)は\
を「Word」として扱い、その後に停止します。 (前方ワードを削除するMd(escape-d)または後方ワードを削除するM-backspaceとは異なります;それらはワードを削除します過去バックスラッシュ) 。 Ctrl-wは、改行を「Word」として扱います(これは実際には必要なものではありません。削除する最初の空白以外の文字から、前の行の\
まで)。
ctrl-left(またはescape-f)/ ctrl-right(またはescape-b)カーソルを単語単位で移動すると、control-wの「行」の先頭にすばやく移動できます。または、ctrl-rで\
のi-searchを逆にすると、そこに到達し、次にctrl-right + leftで次の行の最初の単語に移動できます。
Ctrl- /は元に戻す機能です。キーリピートなどを積極的に使用し、オーバーシュートからすばやく回復できるため、非常に便利です。
Bash/readline行編集を定期的に使用する場合、これらのコマンドの多くはすでに覚えています。ここでは、bashの行編集の経験が浅く、コピーして貼り付けたほうがいいと思っていて、bashに貼り付けた方がいいと思う人のために、ここで触れています。特にエディターが既に開いている場合は、これは確かにオプションです。
もう1つのおそらく有用な編集コマンドはM- \(メタ/エスケープバックスラッシュ)です。これにより、カーソルの周囲の空白が削除されます。カーソルを\
の上に置いて2回使用するだけで、\
の継続を持つ複数行のものとして残すことができます。たとえば、上矢印キーでコマンドを呼び出します
\
を検索し、次に右矢印(またはctrl-f)でカーソルを\
の後のスペースに移動します\
。 (または、通常はエスケープ接頭辞を送信することにより、端末がemacs行編集メタとして機能するように適切に設定されている場合は、alt -\
)(私はこれらのステップを覚える提案していません。これは、ジョブを完了するために行編集を使用する1つの方法にすぎません。 =)
または、control-wで提案したように、\
と改行を削除することもできます(必要に応じて、空白を1スペースに折りたたむこともできます)。 Delete/ctrl-dまたはバックスペースを使用すると、カーソルが適切な場所にあるときに改行またはバックスラッシュが削除されます。 Bashの行編集には、空白を(0ではなく)1スペースに縮小するemacs M-space
がないようですが、M -\
+スペースを使用して手動で行うことができます。
次のような形式のWebページからテキストをコピーする場合:
Sudo apt install gcc git pkg-config meson ninja-build \
libavcodec-dev libavformat-dev libavutil-dev \
libsdl2-dev
それが機能していない場合は、一度に1行ずつコピーして、端末に1行ずつ貼り付ける必要があります。各行をバックスラッシュの最後にコピーします(\
)とそれに続く空白なし。
あるいは、3行すべてをgedit
または別のエディターにコピーし、\を削除して、次のような「ワンライナー」を作成できます。
Sudo apt install gcc git pkg-config meson ninja-build libavcodec-dev libavformat-dev libavutil-dev libsdl2-dev
次に、エディターからワンライナーをコピーして、ターミナルに貼り付けます。