最後のコマンド実行の終了状態を保存したいのですが(ファイル、変数、関係ありません)、この操作は対話型シェルで自動的に実行する必要があり、同様のコマンドを手動で実行することはvar=$?
オプションではありません。
PROMPT_COMMAND
私はこの仕事にそれを使うことにしました。以下で、私が試したことがうまくいかないことを示すことがわかります。
/home/exit_status$ export PROMPT_COMMAND="echo $?"
0
/home/exit_status$ rm /
rm: cannot remove ‘/’: Is a directory
0
/home/exit_status$ echo $?
1
0
上記のコードが期待どおりに機能するようにするにはどうすればよいですか?アーカイブする方法を見つけることができるので、助けは必要ありません。私は文脈を提供するためにこれを言及しました。
答え1
二重引用符を使用したため、$?
値を割り当てると拡張されます。以下を使用してこれを確認できますset -x
。
$ PROMPT_COMMAND="echo $?"
+ PROMPT_COMMAND='echo 0'
++ echo 0
0
二重引用符を一重引用符に変更すると、目的の動作が得られます。
$ PROMPT_COMMAND='echo $?'
+ PROMPT_COMMAND='echo $?'
++ echo 0
0
つまり
$ set +x
+ set +x
0
$ ls nofile
ls: cannot access 'nofile': No such file or directory
2
答え2
コマンドの後にvarに入れます。
/home/exit_status$ export PROMPT_COMMAND="echo $?"
0
/home/exit_status$ rm /
rm: cannot remove ‘/’: Is a directory
0
/home/exit_status$ u=$?
0
/home/exit_status$ echo $u
1
0
$u
リセットされるまでホストの状態を維持します。- すべてのコマンドが上書きされている
u=$?
ため挿入できません。PROMPT_COMMAND
$u
- しかし、これがスクリプトで動作するかどうかはわかりません。