インタラクティブシェルのエココマンドとファイルへの出力[閉じる]

インタラクティブシェルのエココマンドとファイルへの出力[閉じる]

私は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

出力はxtracestderr に送信されます。今後リダイレクトが実行される前に、このコマンドの評価が含まれます。

だから:

set -x # or set -o xtrace
echo test 2> file

+ echo teststderrがある場所に移動し、filefd 2でシェルを開き、を実行しますecho test。行くには、次のものが+ echo test必要fileです。

{ echo test; } 2> file

今回はコマンドグループでリダイレクトされ、echo testコマンドが評価されます(そして+ echo testこの時点でstderrに移動しますfile)。

一部のシェル(例:AT&T)ksh+ 2> filemksh

これはまた、そのコマンドグループ内で実行されるすべてのコマンドの標準エラーがに移動することを意味します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

関連情報