使用
time sleep 1
生産する:
$ time sleep 1
real 0m1.005s
user 0m0.001s
sys 0m0.001s
sleep
終了コードや実行したいコマンドを印刷するために使用できるコマンドはありますか?
私が好きなもの:
$ log-exit-code sleep 1
たぶんそれで十分でしょうか?
sleep 1 && echo "$?"
ベストアンサー1
cmd && echo "$?"
必ず 0 だけを印刷するので動作しません (echo
前のコマンドが正常に完了した場合にのみ実行されます)。
以下は短いシェル関数です:
tellexit () {
"$@"
local err="$?"
printf 'exit code\t%d\n' "$err" >/dev/tty
return "$err"
}
これは、コマンドと同様に、指定されたコマンドの終了コードを印刷しますtime
。
$ tellexit echo "hello world"
hello world
exit code 0
$ tellexit false
exit code 1
関数内でリダイレクトして、printf
標準出力やエラーストリームからゴミを得ることなくリダイレクトを使用できます。/dev/tty
tellexit
$ tellexit bash -c 'echo hello; echo world >&2' >out 2>err
exit code 0
$ cat out
hello
$ cat err
world
終了コードを変数に保存すると、それを呼び出し元に返すことができます。
$ tellexit false || echo 'failed'
exit code 1
failed
同じ機能の高度なバージョンは、終了コードが128より大きい場合(信号によって終了したことを意味します)、コマンドを終了した信号も印刷します。
tellexit () {
"$@"
local err="$?"
if [ "$err" -gt 128 ]; then
printf 'exit code\t%d (%s)\n' "$err" "$(kill -l "$err")" >/dev/tty
else
printf 'exit code\t%d\n' "$err" >/dev/tty
fi
return "$err"
}
テスト:
$ tellexit sh -c 'kill $$'
exit code 143 (TERM)
$ tellexit sh -c 'kill -9 $$'
Killed
exit code 137 (KILL)
( // /local
が必要な場合や他のシェルも理解できる形式に変更できます。)ash
pdksh
bash
zsh
typeset