&&はバックグラウンドスクリプトで&と一緒に使用することはできません。

&&はバックグラウンドスクリプトで&と一緒に使用することはできません。

このスクリプトがあります。

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 && cmd2cmd1「実行、成功すれば実行」を意味します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戻りコードを直接処理するため、使い勝手が悪いと思います。

関連情報