私の知る限りでは、コマンドの後に&
を使用するのはバックグラウンドで実行するためです。
&
の使用例:tar -czf file.tar.gz dirname &
しかし、&&
はどうですか。 (この例を見てください: https://serverfault.com/questions/215179/centos-100-disk-full-how-to-remove-log-files-history-etc#answer -215188 )
&&
前のコマンドが正常に完了したかどうかに基づいて何かをすることができます - それがdo_something && do_something_else_that_depended_on_something
として連鎖されるのを見る傾向がある理由です。
さらに、論理的なorである||
、および以前のコマンドに何が起こってもかまわない単なる区切り文字である;
もあります。
$ false || echo "Oops, fail"
Oops, fail
$ true || echo "Will not be printed"
$
$ true && echo "Things went well"
Things went well
$ false && echo "Will not be printed"
$
$ false ; echo "This will always run"
This will always run
これに関するいくつかの詳細はここで見つけることができます Bashマニュアルのコマンドのリスト 。
コマンドライン -
&&
の目的は何ですか?
シェルでは、あなたが見るとき
$ command one && command two
その意図は、最初のコマンドが成功した場合にのみ、&&
に続くコマンドを実行することです。これはPosixシェルの慣用句で、Bashだけではありません。
最初のプロセスが失敗した場合、2番目のプロセスが実行されないようにします。
プログラムは終了時に シグナル を返します。正常に終了した場合は0を返し、正常に終了しなかった場合は0より大きい値を返します。これにより、プロセス間の通信量が制限されます。
&&
は posixシェル文法 ではAND_IF
と呼ばれ、 and_or
リストの一部です コマンドも含まれます。これには、同じ意味を持つ||
であるOR_IF
も含まれます。
文法記号:
%token AND_IF OR_IF DSEMI /* '&&' '||' ';;' */
文法:
and_or : pipeline | and_or AND_IF linebreak pipeline | and_or OR_IF linebreak pipeline
どちらの演算子も同じ優先順位を持ち、左から右に評価されます(これらは左結合です)。次に例を示します。
$ false && echo foo || echo bar $ true || echo foo && echo bar
どちらもbar
だけをエコーします。
前者の場合、falseは1
のステータスで終了するコマンドです。
$ false
$ echo $?
1
つまり、echo foo
は実行されません(つまり、echo foo
の短絡)。その後、コマンドecho bar
が実行されます。
後者の場合、trueは0
のコードで終了します。
$ true
$ echo $?
0
したがってecho foo
は実行されず、echo bar
が実行されます。
'&&'のごく一般的な使い方は、autotoolsを使ってソフトウェアをコンパイルすることです。例えば:
./configure --prefix=/usr && make && Sudo make install
基本的にconfigureが成功するとmakeがコンパイルのために実行され、それが成功するとmakeがrootとして実行されプログラムをインストールします。私は、物事がうまくいくことをほとんど確信しているときにこれを使います、そしてそれは私が進歩を「モニターする」のではなくstackoverflowを見ることのような他の重要なことをすることを可能にします。
時々私は本当にうんざりする...
tar xf package.tar.gz && ( cd package; ./configure && make && Sudo make install ) && rm package -rf
私はこれを例えば最初からLinuxを作るときに行います。
&&
はコマンドをまとめます。後続のコマンドは、先行するコマンドが成功した場合にのみ実行されます。
同様に、||
は、先行するコマンドが失敗した場合に連続したコマンドの実行を許可します。
Bashシェルプログラミング を参照してください。
例を見てください。
mkdir test && echo "Something" > test/file
シェルはディレクトリtest
を作成しようとし、そしてそれが成功した場合のみlはその中にファイルを作成しようとします。
そのため、手順の1つが失敗した場合は、一連の手順を中断することができます。
command_1 && command_2
:command_1が正常に実行された場合にのみcommand_2を実行します。
command_1 || command_2
:command_1が正常に実行されなかった場合にのみcommand_2を実行します。
メインストリームのプログラミング言語で 'if'条件が実行されるのと同じように感じます。例えば、if (condition_1 && condition_2){...}
のcondition_2はfalse
name__の場合は省略され、if (condition_1 || condition_2){...}
の場合はcondition_1がtrue
name__の場合は省略されます。参照してください、それはあなたがコーディングに使うのと同じトリックです:)
最初のステートメントが正常に終了したら、2番目のステートメントを実行します。 if文のように:
if (1 == 1 && 2 == 2)
echo "test;"
最初は1 == 1であれば試し、それが真ならば2 == 2であるかどうかを調べる