.shで&&でgitを使用することは失敗しますが、コマンドラインで失敗するのはなぜですか?

.shで&&でgitを使用することは失敗しますが、コマンドラインで失敗するのはなぜですか?

update_content.sh3つの連続したコマンドを実行するスクリプト(という)があり、git最初のバージョンは次のとおりです。

#!/bin/sh
git fetch --all && git reset --hard && git merge

実行すると、次の出力が表示されます。

web@bane:~# ./update_content.sh
Fetching origin
error: unable to create file locales/fr.json (File exists)
error: unable to create file locales/it.json (File exists)
fatal: Could not reset index file to revision 'HEAD'.

しかし、これを次のように変更すると:

#!/bin/sh
git fetch --all
git reset --hard
git merge

実行してみると次のようになります。

web@bane:~# ./update_content.sh
Fetching origin
HEAD is now at 5859b2e Added Business tab
Already up-to-date.

改行アプローチは私が望む結果を得ますが、「ステップが失敗した場合は続行しません」という品質はありません&&gitこれがどのように機能するかについて互換性がないものがありますか、&&それとも何かが欠けていますか&&

もう少し詳しく調べたところ、&&コマンドラインから実行してもライナーはエラーを発生させませんが、実際にはローカルの作業コピーをリセットしませんが、スクリプトの内部(および当時)の改行メソッドではエラーが発生することがわかりました。

ベストアンサー1

通常、最初の2つのコマンドの1つがゼロ以外のコードで終了したと推測します。ただし、これを行うと、次のコマンドはすべて実行されず、実行されないコマンドはエラーメッセージを生成しません。

ただし、次のコマンドを使用してコマンドの終了コードを確認できます。

git fetch --all   ; echo "exit code: ${?}"
git reset --hard  ; echo "exit code: ${?}"
git merge         ; echo "exit code: ${?}"

これはスクリプトを実行するのに役立ちます。

bash -vx ./update_content.sh

おすすめ記事