12

すべてのコマンドが発生したときにエコーされるようにする Bash スクリプトを作成しています。set -xこの動作のオフとオンをそれぞれ使用しset +x、切り替える必要があることはわかっています ( SOF の投稿はこちら)。ただし、すべてをエコーするわけではありません。つまり、I/O リダイレクトです。

たとえば、次の非常に単純な Bash スクリプトがあるとします。

set -x
./command1 > output1
./command2 arg1 arg2 > output2

これが出力になります

+ ./command1
+ ./command2 arg1 arg2

Bash は、stdout リダイレクトをoutput1およびoutput2にエコーしません。どうしてこれなの?どうすればこの動作を達成できますか? おそらくshopt、スクリプトで設定する必要があるオプションはありますか?

注:パイプが期待どおりに印刷されないことにも気付きました。たとえば、次のコマンドを使用するとします。

set -x
./command3 | tee output3

この出力が得られます:

+ tee output3
+ ./command3

スクリプトによってパイプの順序を変更するのではなく、コマンドが記述されたとおりにエコーされるようにするにはどうすればよいですか?

4

3 に答える 3

6

むしろ使用する必要がありますset -v

-v 読み込まれたシェル入力行を表示します。

出力は期待に応えているようです。

$ set -v
$ ./command1 > output1
./command1 > output1
sh: ./command1: No such file or directory
$ ./command2 arg1 arg2 > output2
./command2 arg1 arg2 > output2
sh: ./command2: No such file or directory
$ ./command3 | tee output3
./command3 | tee output3
sh: ./command3: No such file or directory
于 2015-10-13T08:59:49.577 に答える
4

ではできませんset -x。唯一のオプションは、DEBUGトラップを介して現在のコマンドを表示することです。

trap 'printf %s\\n "$BASH_COMMAND" >&2' DEBUG

これは、正確な引数を表示しませんset -x。それらを組み合わせると、全体像が得られるはずですが、デバッグ出力が多くなります。

于 2013-03-12T16:30:10.660 に答える