bashスクリプト内で実行された最後のコマンドをエコーしようとしています。history,tail,head,sed
コマンドがパーサーの観点からスクリプト内の特定の行を表す場合に正常に機能するものを使用して、それを行う方法を見つけました。ただし、コマンドがcase
ステートメント内に挿入された場合など、状況によっては期待どおりの出力が得られません。
スクリプト:
#!/bin/bash
set -o history
date
last=$(echo `history |tail -n2 |head -n1` | sed 's/[0-9]* //')
echo "last command is [$last]"
case "1" in
"1")
date
last=$(echo `history |tail -n2 |head -n1` | sed 's/[0-9]* //')
echo "last command is [$last]"
;;
esac
出力:
Tue May 24 12:36:04 CEST 2011
last command is [date]
Tue May 24 12:36:04 CEST 2011
last command is [echo "last command is [$last]"]
[Q]このコマンドがbashスクリプト内でどのように/どこで呼び出されたかに関係なく、誰かが最後の実行コマンドをエコーする方法を見つけるのを手伝ってもらえますか?
私の答え
私の仲間のSO'ersからの感謝の貢献にもかかわらず、私は書くために選んだrun
一つのコマンドとして、すべてのパラメータを実行し、それが失敗した場合、コマンドとそのエラーコードを表示する- -機能を、次のような利点を:
-Iのみ必要をします確認したいコマンドを前に付けて、run
1行に
まとめ、スクリプトの簡潔さに影響を与えない-これらのコマンドのいずれかでスクリプトが失敗すると、スクリプトの最後の出力行は、どのコマンドを明確に表示するメッセージになります。終了コードとともに失敗し、デバッグが容易になります
スクリプトの例:
#!/bin/bash
die() { echo >&2 -e "\nERROR: $@\n"; exit 1; }
run() { "$@"; code=$?; [ $code -ne 0 ] && die "command [$*] failed with error code $code"; }
case "1" in
"1")
run ls /opt
run ls /wrong-dir
;;
esac
出力:
$ ./test.sh
apacheds google iptables
ls: cannot access /wrong-dir: No such file or directory
ERROR: command [ls /wrong-dir] failed with error code 2
複数の引数、引数としてのbash変数、引用符で囲まれた引数を使用してさまざまなコマンドをテストしましたが、run
関数はそれらを壊しませんでした。私がこれまでに見つけた唯一の問題は、壊れたエコーを実行することですが、とにかくエコーをチェックする予定はありません。
run()
引用符が使用されている場合は正しく機能しないことに注意してくださいrun ssh-keygen -t rsa -C info@example.org -f ./id_rsa -N ""
。たとえば、これは失敗します。