もし活用方法がないのかと思いました。歴史コマンドを実行したが正常に実行されたコマンドのみをリストします。同様に、エラーが発生したエラーを一覧表示する方法はありますか?
各コマンドの終了状態は次のとおりです。
0
- コマンドの実行成功
1
- 拡張またはリダイレクト中のエラーのため、ゼロより大きいシャットダウン状態でコマンドが失敗しました。
2
- コマンドが無効になっている
12
- コマンドが見つかりましたが実行できません - コマンドが見つかりませ
127
ん
次のコマンドで確認できますecho $?
から: http://www.linuxnix.com/2011/03/find-exit-status-script-command-linux.html
例:
次の4つのコマンドを実行した後:
ls
help
lss
ls nonexistentfile
「ls」と「help」のみが必要な成功したコマンド(終了ステータス0)のみを印刷するためにテストを試みました。
for j in `history | tail -5 | head -4 | cut -d ' ' -f5-`; do $j > cmd_out; if [[ `echo $?` != 0 ]]; then :; else echo $j | grep -v 'bash'; fi; done; rm cmd_out
この出力は次のようになります。
ls
help
bash: lss: command not found
ls
bash: nonexistentfile.txt: command not found
これはある程度動作しますが、2つの問題があります。
- 何らかの理由で
grep -v 'bash'
「bash」を含む行は除外されませんが、これはgrep 'bash'
「bash」を含む行だけを含み、なぜ1つは機能し、もう1つは機能しないのかわかりません。 - 各行/コマンドを文字列で区切ります。最後
ls
のコマンドは必要ls nonexistentfile
ですが、別のコマンドでls
実行されています。nonexistentfile
コマンドで何を調整する必要があるのか、どうすればよいのかご存知ですか?
答え1
誰が何をしたのかを追跡するために共有アカウントで使用したトリックは次のとおりです。
PROMPT_COMMAND="history -a; sed -i '\$s/\$/ \#$NAME/' $HISTFILE; history -r; $PROMPT_COMMAND"
history
これは表示前に記録されますPROMPT
。実際には各コマンドの後に記録されます。以下を使用して、履歴に終了コードを保存するように変更できます。
PROMPT_COMMAND="CODE=$?; history -a; sed -i '\$s/\$/ \#\$CODE/' $HISTFILE; history -r; $PROMPT_COMMAND"
これにより、履歴に次の項目が残ります。
$ history 2
1271 vim .bashrc #0
1272 history 2
(最後の項目が更新されます。後ろにコマンドがhistory
終了するため、この出力に終了コードは表示されません。 )
これにより、プロンプトの記録にコメントが追加されるという面倒な効果があります。
$ # press up
$ history 2 #0
コメントは通常、実行や出力には影響しませんが、編集が難しくなります。
これでgrep
、履歴を使用して、どのコードが正常に終了したかを確認できます。
history | grep '#0$'
# or grep '#[^0]*$' for unsuccessful commands.