バックグラウンドで複数のコマンドを実行するためのshファイルを作成しています。
ファイルの特定の行には、zipファイルを更新するコマンドがあります。たとえば、次のようになります。
zip -d archive.zip file.txt
この file.txt は常に archive.zip の一部ではない可能性があります。それ以外の場合、シェルスクリプトは次の行で中断されます。
zip warning: name not matched
ファイルが存在しないことを無視し、次の行に進みたいと思います。どうすればいいですか?
答え1
通常、シェルスクリプトはエラーを生成する行でもシェルスクリプトの実行を妨げません。次の行だけが続きます。
注目すべき例外は、サブコマンドが失敗した場合にシェルを終了するようにフラグを設定した場合です。これは時々、スクリプトの上部近くに「set -e」を追加することによって行うことができます。スクリプトにこのような内容がある場合、スクリプトのコマンドがエラーを返すと中断されます。この場合、オプションは次のようになります。
このオプションを削除してください。これはスクリプトの残りの部分に影響を与える可能性があるため、気まぐれにしないでください。
現在のスクリプトセクションのオプションをオフにしてからもう一度オンにして続行します。
set +e zip -d archive.zip file.txt set -e
コマンドが失敗した場合でも、シェルが正常に処理できるように、失敗した行のエスケープを提供します。さまざまな方法でこれを実行できますが、簡単な方法はOR演算子を使用することです。
zip -d archive.zip file.txt || true
これはzipコマンドを実行しますが、失敗した場合は親シェルが戻りコード(もちろん成功)を取得できる実際のコマンドを実行します。時々、このように書かれていることがわかります。
||:
これは少し速くてトリッキーですが、魔法ではありません。:
これは、何もしなくても成功エラーコードを返すシェル組み込みのno-opコマンドです。もう1つのアプローチは、サブシェルでコマンドを実行してサブシェル
()
内のコマンドが失敗した場合でも、サブシェルが操作を完了し、セットを含むset -e
親スクリプトが終了しないようにラップすることです。これは単一のコマンドには最適ではありませんが、コマンドセット全体を実行したい場合に便利です。
一方、zipによって生成されたエラーメッセージのみを表示したくない場合は、(2> /dev/null
)を使用して標準エラーストリームを/ dev / nullにリダイレクトして生成されたメッセージを表示しないようにすることもできます(または使用してオフにする2>&-
)。