2013-03-12 13 views
6

私はすべてのコマンドが発生するとエコーされるようにBashスクリプトを書いています。私はとset +xを使用して、この動作をオンとオフに切り替える必要があることを知っています(SOF post here)。ただし、I/Oリダイレクトなどすべてをエコーし​​ません。バッシュセット-xエコーリダイレクトコマンドと同様に

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

これはOUTPUT1OUTPUT2にリダイレクト

+ ./command1 
+ ./command2 arg1 arg2 

バッシュが私の標準出力をエコーされていない出力されます。たとえば

、のは、私はこの非常に単純なbashスクリプトを持っているとしましょう。どうしてこれなの?どのようにこの動作を達成できますか?おそらく、スクリプトに設定する必要があるshoptオプションがありますか?

注記:パイプが期待どおりに印刷されないことに気付きました。例えば、私はこのコマンドを使用した場合:

set -x 
./command3 | tee output3 

私はこの出力を取得します:

+ tee output3 
+ ./command3 
コマンドはそれらが持つのではなく、書かれている方法で正確にエコーさI作るにはどうすればよい

スクリプトによって並べ替えられたパイプ?

答えて

4

set -xでは不可能です。唯一の方法は、現在のコマンドをDEBUGトラップで表示することです。

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

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

+0

しかし、FreeBSDシステムはどうですか?私はDEBUGシグナルがないので、そのようなトリックをそこで行うことができないからです。助言がありますか? – vwvolodya

5

set -xとDEBUGトラップは、特定の構成要素が使用されている場合には完全な情報を提供しません。

ex1.sh

for i in a b c 
do 
    echo $i # Where does the output go? 
done > outfile # Here! 

ex2.sh

c="this" 
case "$c" in 
    this) echo sure ;; # Where does the output go? 
    that) echo okay ;; 
esac > choice # Here! 

ex3.sh

what="up" 
while [ "$what" = "up" ] 
do 
    echo "Going down!" # Where does the output go? 
    what="down" 
    echo "Newton rulezzz!" > thelaw 
done > trying # Here! 

及びこれらのようなより多くの、すべておろか:

例としては、ネストされたバリアントの種類。私はこれらを処理する簡単な方法を知りませんが、地雷である完全なBashスクリプト解析の土地に入るのを除いて...

EDIT:Bash固有の機能は必須ではなく、下位互換性Bourneシェルを行いますと、Kornシェル(バージョン93U + 2012-08-01でテストkshが、)少し良くリダイレ​​クトのための情報を示す上で行います。

$ ksh -x ex1.sh 
+ 1> outfile 
+ echo a 
+ echo b 
+ echo c 

$ ksh -x ex2.sh 
+ c=this 
+ 1> choice 
+ echo sure 

$ ksh -x ex3.sh 
+ what=up 
+ 1> trying 
+ [ up '=' up ] 
+ echo 'Going down!' 
+ what=down 
+ echo 'Newton rulezzz!' 
+ 1> thelaw 
+ [ down '=' up ] 
3

あなたはむしろ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 
+0

これは私にとって完璧に機能し、この質問に対する最良の答えと思われます。ありがとう。 – Nickolai

+0

これらの場合の入力は一度しか読み取られないため、関数を含むより複雑なbashスクリプトではこれは機能しません。 –

関連する問題