このスクリプトがあります。
cd foo && git pull && node server.js & && pid=$! && echo "$pid"
しかし、bashはこの部分が好きではないようです。& &&
...それで、私は次のように変更しました。
set -e
cd foo
git pull
node server.js &
pid=$!
echo "$pid"
&&
しかし、二重アンパサンドを代わりに使用する方法はありますか?
おそらく質問の目的は、これら2つが同じかどうかです。
cd foo && git pull && node server.js & && pid=$! && echo "$pid"
cd foo && git pull && ( node server.js & ) && pid=$! && echo "$pid"
私の推測では、いいえ同じ..
答え1
cmd1 && cmd2
cmd1
「実行、成功すれば実行」を意味しますcmd2
。実行が完了するまでコマンドが成功したかどうかはわかりません。したがって、1つのコマンドをバックグラウンドに置き、次のコマンドの実行が最初のコマンドの成功に依存するようにすることは意味がありません。
あなたが本当に欲しいのは「cmd1
バックグラウンドで起動してから実行」しcmd2
ているようです。これだけですcmd1 & cmd2
。
したがって、必要なコマンドは次のようになります。cd foo && git pull && node server.js & pid=$! && echo "$pid"
答え2
スペースは無料です。 IMOでは、このような長いコマンドのリストがあると、改行が読みやすくなります。&&
論理的な意味で使用したい場合でも、次のようになります。
cd foo &&
git pull && {
node server.js &
pid=$!
echo "$pid"
}
node
とがすべて成功した場合にのみcd
ブロックが入力されますgit
。
この場合は、set -e
戻りコードを直接処理するため、使い勝手が悪いと思います。