「実行したコマンドを記録してコマンドの出力を記録する」のを何度も見たことがありますか?それは頻繁に起こり、についてはあなたが実行しているコマンドは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.....
今、*ハッキリです。私の回避策は、とにかく大量のbashプロセスを生み出したので、それはまっすぐな改善です。 – Sorpigal
誰も良いアイデアを持っていないと思われるので、私はこれを受け入れています。 – Sorpigal