Linux Bash構文:&&、\、および-の意味


14

bashコマンドの最後で「&&」、「\」、「-」は何を意味しますか?

特に、Ubuntuのaptitudeパッケージマネージャーに公開キーを追加することになっている次の行の組み合わせに遭遇しましたが、ここで使用されている文字は何ですか?

    gpg --keyserver keyserver.ubuntu.com --recv 26C2E075 && \
    gpg --export --armor 26C2E075 | sudo apt-key add-&& \
    sudo apt-get update

「/」は「\」と同じではありません
トーマス

トーマス:投稿を修正しました
カイル・ブラント

ここでバックスラッシュは必要ありません。なぜなら、&&は行の継続を意味するのに十分だからです。ただし、バックスラッシュを使用すると読みやすくなります。
追って通知があるまで一時停止します。

回答:


37

「&&」はコマンドを連結するために使用され、次のコマンドは、先行コマンドがエラーなしで終了した場合にのみ実行されます(より正確には、戻りコード0で終了します)。

行末の「\」自体は、行を連結する手段です。したがって、次の2行:

gpg --keyserver keyserver.ubuntu.com --recv 26C2E075 && \
gpg --export --armor 26C2E075

行が単一行として書き込まれた場合とまったく同じように処理されます。

gpg --keyserver keyserver.ubuntu.com --recv 26C2E075 && gpg --export --armor 26C2E075

「-」は、特定のbash関数を持たないコマンドライン引数です。正確な処理方法は、実行中のコマンド(この場合はapt-key)に依存します。コンテキストに応じて、通常は「ファイルからではなく標準入力からデータを読み取る」、または「コマンドライン引数としてではなくデータとして残りの行を処理することを示すために使用されます。


5
この場合、 '-'はsudoのパラメーターではなく、 'apt-key'のパラメーターです。つまり、キーファイルの代わりに、 'apt-key'はパイプ( '|')からその標準入力へのデータを使用します。キーとして。「--output a_file_name.key」を持たない「gpg --export」オプションは、パイプ(「|」)を介して「apt-key」Easyのstdinにgpg stdoutから新しいキーをプッシュします。 )
エドマール2009

2
おっと。それは私が半分眠っている間に質問に答えるために得るものです。修繕。
goldPseudo 2009

6
&& == if the first command succeeded, run the next one
\ == the next line is part of the first line, not two seperate lines
- == read the input from stdin (console)

6

&&は論理ANDです:
&&は論理ANDを表現する方法です。つまり、両方の式が真である場合にのみ式全体がTrueになります。ロジックでは、PとQの両方が真である場合にのみステートメント全体(P&Q)が真であると言われています。

この結果として、コンピューターは一般にP&Qを短絡評価として扱います。したがって、ステートメント全体は、PとQの両方が真の場合にのみ真になるため、Pが偽の場合、ステートメントQは評価されません。基本的に、コンピューターは怠zy(効率的)であり、Qの評価がわからなくても気にしません。これは論理ORにも当てはまります。前のリンクを参照してください。

Bashの&&の3つのコンテキスト:

1)コマンドの終了ステータスでの短絡評価の使用:
すべてのコマンドには終了ステータスがあります。コマンドにエラーがある場合、コマンドの終了ステータスはゼロ以外です。したがって、終了ステータスがゼロ以外で、&&を使用してコマンドを1つのステートメントにチェーンする場合、前のコマンドの終了ステータスが0(True)でない場合、後のコマンドは評価(実行)されません。これは、短絡評価のためです。あなたが持っている場合:

P && Q

Pが真でない場合、Qは実行されません(Pが0以外のステータスで終了する場合、真ではありません)。次と同じ:

./configure && make

configureにエラーがあった場合、makeは実行されませんでした。したがって、基本的には、if thenステートメントを記述する方法になります。

if ./configure ; then
   make
fi

その場合、ほとんどのコンテキストでは0はfalseですが、終了ステータスになる場合はそうではありません。

2)&&は、Bashのビルトイン[[]]テストコマンドで使用できます。

&& bash [[]]の組み込みテストコマンド内で使用して、コマンドを結合するのと同様の方法で式を結合することもできます。テスト操作全体が真になるのは、&&の両方のオペランド(サイド)が真である場合のみです。次に例を示します。

if [[ ( $a -gt 2 ) && ( $a -lt 5 ) ]]; then ... 

$ aが2〜5の整数(2と5を含まない)である場合の言い方になります。

3)算術評価:

最後に、&&は算術評価で論理ANDとして使用できます。場合は、両方の非ゼロである、次の中の数字の(論理AND)、それは他の1が返され、0を返します。

kbrandt@desktop:~/$ echo $((1 & 1))
1
kbrandt@desktop:~/$ echo $((0 && 1))
0

@Kyle:&&、「AND制御オペレータ」である論理式の外側に使用される同様の挙動が、技術的に異なる
drAlberT

あなたのコメントに従わないでください、論理式の外側で何を意味しますか?
カイルブラント

式では、&&制御演算子は「論理AND」の平均を想定していますが、それ以外の場合は「AND」のみです。リストで使用される「AND制御演算子」です。論理演算子は、式内の算術展開のコンテキストで使用されます。
drAlberT 09

このif [./configure]例では、ブラケットを削除する必要があります。正しいのはif ./configure; then make...
ジュリアーノ

ジュリアーノ、良いキャッチ、更新されます。AlberT、マニュアルページに記載されている用語以外の違いはありますか?
カイルブラント

3

「本当の」意味を説明することでより良くなると思います。意味は別のものです:)

  • &&は「AND」制御演算子です。bash manから:
    制御演算子&&および|| ANDリストとORリストをそれぞれ示します。
    ANDリストの形式は  
        command1 && command2     
    command2は、command1がゼロの終了ステータスを返す場合にのみ実行されます。
    [..切る..]
    ANDおよびORリストの戻りステータスは、最後のコマンドの終了ステータスです
    リストで実行されます。
    
    制御演算子はあります
    制御機能を実行するトークン。次の記号のいずれかです。
        || &&&; ;; ()|
    
  • \「あるエスケープ文字は、」であり、bashで使用可能な3つの引用メカニズムの1つです。
    見積り
       引用は、シェルに対して特定の文字または単語の特別な意味を削除するために使用されます。
    [..切る..]
       3つの引用メカニズムがあります:エスケープ文字、単一引用符、二重引用符。
       引用符で囲まれていないバックスラッシュ(\)はエスケープ文字です。を除き、次の文字のリテラル値を保持します。\ペアが表示され、バックスラッシュ自体が引用されていない場合、\は行の継続として扱われます(つまり、入力ストリームから削除され、事実上無視されます)。
    [..切る..]
    バックスラッシュの特別な意味は、$、 `、"、\、または。
    
    これは、行の最後にエスケープ文字(「\」)を置くと、実際にその直後の改行文字(RETURN文字)をエスケープしているため、「行を継続する」という効果があることを意味します。他の人はすでに答えで説明しています
  • 一部のコマンドがパラメーターとして受け入れるダッシュ文字「-」は、シェルの特殊文字または演算子ではなく、規則です。すでに指摘したように、これは標準のI / Oストリームの一種の場所マーカーです。参照するプログラムに応じて、stdin(標準入力)またはstdout(標準出力)にとどまる場合があります。

私の2セント


1
おそらくtl; drのケースになるでしょう。マンページの巨大なチャンクを貼り付ける-そのまま啓発する-はおそらくOPを威圧するでしょう。
rodjek 09
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.