私はbashで私が実行するコマンドを作成し、そのコマンドの出力をインタラクティブプロンプトのファイルに書き込むためのエレガントな方法を探しています。次のコマンドを実行します。
$ls -alh > list_dir
次のような内容が list_dir に書き込まれます。
$ls -alh > list_dir
total 12K
drwxr-xr-x 2 root root 4.0K Dec 21 13:30 .
drwx------ 5 root root 4.0K Dec 21 13:30 ..
-rw-r--r-- 1 root root 842 Dec 21 13:09 file
-rw-r--r-- 1 root root 0 Dec 21 13:29 file1
-rw-r--r-- 1 root root 0 Dec 21 13:29 file2
私はスクリプトで動作すると主張するソリューションを含む記事をたくさん見つけましたが、インタラクティブシェルで動作する記事はありません。たとえば、多くの人はスクリプトの上部に以下を追加することをお勧めします。
set -x
シェルにこのコマンドを入力すると、コマンドは標準出力として印刷されますが(うまく印刷されませんが)、出力リダイレクトにそのコマンドを含める方法が見つかりませんでした。
私はまた、これを行うためにスクリプトを使用することを提案する多くの人々を見ました。これは私が探しているものを見つけるのに最も近いものですが、常にすべてを文書化したくはありません。どのコマンドがファイルにリダイレクトされるかを制御したいと思います。
この問題に対する良い解決策を知っている人はいますか?私は日常的な使用にあまりかさばらない限り、より奇妙なアイデアに開いています。
答え1
set -x オプションはスクリプトをデバッグモードに切り替えます。実際のコマンドはstderrに反映されます。したがって、stdoutとstderrをいくつかのファイルにリダイレクトする必要があります。この試み
your_script.sh &> outputfile.txt
答え2
出力はxtrace
stderr に送信されます。今後リダイレクトが実行される前に、このコマンドの評価が含まれます。
だから:
set -x # or set -o xtrace
echo test 2> file
+ echo test
stderrがある場所に移動し、file
fd 2でシェルを開き、を実行しますecho test
。行くには、次のものが+ echo test
必要file
です。
{ echo test; } 2> file
今回はコマンドグループでリダイレクトされ、echo test
コマンドが評価されます(そして+ echo test
この時点でstderrに移動しますfile
)。
一部のシェル(例:AT&T)ksh
は+ 2> file
。mksh
これはまた、そのコマンドグループ内で実行されるすべてのコマンドの標準エラーがに移動することを意味しますfile
。この問題を解決するには、次の手順を実行する必要があります。
set -x
{
cmd 2>&3 3>&-
} 3>&2 2> file
つまり、元のstderrのコピー(fd 3)を保持し、コマンドグループ内のコマンドを復元します。
別の方法は特殊変数をbash
使用することです。$BASH_XTRACEFD
exec 7> file
BASH_XTRACEFD=7
set -x
echo test
ひとりが欲しいならいいね xtrace
出力してみてくださいzsh
。$PS4
特殊変数を使用してカスタマイズすることもできます。
答え3
最も簡単な解決策は、.bashrc
次のようにファイルに関数を追加することです。
my_run(){ echo $@ eval $@ }
source .bashrc
この機能をぜひ追加してみてください。次に、例を使用してコマンドラインに次のように入力します。
my_run ls -ahl >list_dir
。
画面でも出力を表示するには、次のコマンドを使用します。
my_run ls -ahl | tee list_dir
関数を使用したくない場合は、コマンドラインでこれを行うにはいくつかの方法があります。
echo "ls -ahl" >list_dir; eval $@ >>list_dir
画面で出力を表示するには、次のいずれかを実行します。
echo "ls -ahl" >list_dir; eval $@ | tee -a list_dir
echo "ls -ahl" | tee list_dir | bash >>list_dir