7

シェルスクリプトset -eでは、スクリプトから実行されたコマンドの一部がゼロ以外の終了コードで終了したときにスクリプトを停止することで、スクリプトをより堅牢にするためによく使用されます。

通常、最後に追加することで、一部のコマンドが成功することを気にしないように指定するのは簡単です|| true

実際には戻り値を気にしているが、ゼロ以外の戻りコードでスクリプトを停止させたくない場合に問題が発生します。次に例を示します。

output=$(possibly-failing-command)
if [ 0 == $? -a -n "$output" ]; then
  ...
else
  ...
fi

|| trueここでは、終了コードのチェック (したがって、コマンド置換式の内部では使用できません) と出力の取得の両方が必要です。ただし、コマンド置換でコマンドが失敗した場合、スクリプト全体が原因で停止しset -eます。

後で設定を解除して元に戻すことなく、スクリプトがここで停止するのを防ぐきれいな方法はあり-eますか?

4

1 に答える 1

6

はい、if ステートメントでプロセス置換をインライン化します

#!/bin/bash

set -e

if ! output=$(possibly-failing-command); then
  ...
else
  ...
fi

コマンドが失敗する

$ ( set -e; if ! output=$(ls -l blah); then echo "command failed"; else echo "output is -->$output<--"; fi )
/bin/ls: cannot access blah: No such file or directory
command failed

コマンドワークス

$ ( set -e; if ! output=$(ls -l core); then echo "command failed"; else echo "output is: $output"; fi )
output is: -rw------- 1 siegex users 139264 2010-12-01 02:02 core
于 2010-12-30T02:48:07.710 に答える