2012-03-22 14 views
4

「実行したコマンドを記録してコマンドの出力を記録する」のを何度も見たことがありますか?それは頻繁に起こり、についてはあなたが実行しているコマンドはset -vいいです、(set -xもいいですが、それは読むのが難しいかもしれませんが)実行されているコマンドをキャプチャする場合はどうなりますか...しかしすべてコマンドは実行されていませんか?bash:set -vの出力をキャプチャする

インタラクティブに実行する私はset -vの出力をキャプチャする方法を全く見ません。

set -v 
echo a 1>/dev/null # 'echo a 1>/dev/null' is printed to the screen 
echo a 2>/dev/null # 'echo a 2>/dev/null\na' is printed to the screen 

私は、スクリプトでこれを置くことができ、物事は良くなる:

echo 'set -v'$'\n''echo a' > setvtest.sh 

bash setvtest.sh 1>/dev/null # 'echo a' is printed to the screen 
bash setvtest.sh 2>/dev/null # 'a' is printed to the screen 

なるほど、それはstderrに行くスクリプトからなります。インラインはどうですか?

set +v 
{ set -v ; echo a ; } 1>/dev/null # no output 
set +v 
(set -v ; echo a ;) 1>/dev/null # no output 

うん、そこには運がありません。

興味深いことに、及びサイドノートとして、これは何も出力生成しません:

echo 'set -v ; echo a' > setvtest.sh 
bash setvtest.sh 1>/dev/null 

私がなぜわからないが、おそらくそれはサブシェルのバージョンは何も返さないも理由です。

シェル機能はどうですか?

setvtest2() { 
    set -v 
    echo a 
} 

setvtest2    # 'a' 
set +v 
setvtest2 1>/dev/null # nothing 
set +v 
setvtest2 2>/dev/null # nothing 

今の質問:set -vの出力をキャプチャするための良い方法はありますか?ここで

がmy-素敵ではないハックですので、私はあまり非常識な何かを探しています:

#!/usr/bin/env bash 

script=/tmp/$$.script 
output=/tmp/$$.out 

echo 'set -v'$'\n'"$1" >"$script" 

bash "$script" 1>"$output" 
cat "$output" 
rm -f "$script" "$output" 

今、私は簡単なスクリプト

bash gen.sh 'echo a' 1>/dev/null # prints 'echo a' 
bash gen.sh 'echo a' 2>/dev/null # prints 'a' 

を実行することができます、しかし確実に、より良い方法があります。このソリューションのダークサイドは、それぞれ、このようなラインがに必要になるということです

bash -v -c "echo a" 1>/dev/null # prints 'echo a' 
bash -v -c "echo a" 2>/dev/null # prints 'a' 

:方法について

#!/bin/bash 
set -o xtrace 
Stuff..... 

答えて

4

あなたが代わりにset経由でオンとオフのオプション-vではbashを実行することができます

+0

今、*ハッキリです。私の回避策は、とにかく大量のbashプロセスを生み出したので、それはまっすぐな改善です。 – Sorpigal

+0

誰も良いアイデアを持っていないと思われるので、私はこれを受け入れています。 – Sorpigal

1

新しいbashプロセスを作成しますが、子プロセスでのみオンになっているので、vオプションをオフにすることを覚えておく必要はありません。

+0

範囲外です!私は元の問題を解決しようとしていません、私は 'set -v'の出力をキャプチャしようとしています。 – Sorpigal

+1

おそらく、-oオプションを指定してbashを呼び出すと、生成するシェルに渡すだけです。 bash -o xtrace gen.shのように、stderrに出力を取り込むことができます。私はset -vがset -o verboseと同じだと思うので、bash -o verbose gen.shはその仕事をしなければなりません。 – pizza