コマンドから元のコマンドを含むファイルに直接出力し、ターミナルで印刷する


8

一部のテストを実行するとき、一連のコマンドを実行する必要があります。これらのすべてを行う方法があれば、それは私にとって非常に有用であり、多くの時間を節約できます。

  • 実行する必要があるコマンドを実行する
  • コマンドからのすべての出力を指定したファイルにリダイレクトします
  • 指定したファイルに元のコマンドを含めます
  • 端末の元のコマンドからの出力を印刷します

人々は私にteeを使用することを提案しました。これは端末への印刷とファイルへの送信の素晴らしい仕事をしますが、元のコマンドは含みません。私が最後にしたいのは、最初の行が実行したコマンドで、その下にコマンドの出力があるファイルです。

誰かがこれを提案しました:

echo "ls -l" | xargs -I{} bash -c "echo >> output.file; eval {} >> output.file"

しかし、これはターミナルに出力を印刷したり、元のコマンドをファイルに含めたりしません。

任意のアイデアをいただければ幸いです。



これは検索で見つかりませんでした-まったく同じではありませんが、おそらく私を答えに導いたでしょう。
shaneoh

うん、これが私がほとんど同じことを言った理由です。しかし、私の意見を完全に正直に言うと、そこからほとんどすべての解決策を取り、それをへのパイプで使用できますtee
Sergiy Kolodyazhnyy 2017年

回答:


14

それはteeあなたが探しているものです。

ls -l | tee outfile

の出力ls -lをstdout(つまり、端末)に出力outfileし、同時にファイルに保存します。しかし:コマンド名をstdoutにもファイルにも書き込みません。これを実現するには、echoコマンドを実行する前にコマンド名だけを入力し、両方の出力をパイプしますtee

( echo "ls -l" && ls -l ) | tee outfile

タイプするのが面倒なので、関数を定義してみませんか?

both(){ ( echo "$@" && "$@" ) | tee outfile ;}

その後、あなたはただ走ることができます

both ls -l

望ましい結果を得るために。関数をあなたの中~/.bashrcに置いて、それをすべての新しいターミナルで定義してください。

あなたがのように最初の引数として出力ファイルを指定できるようにしたい場合

both output ls -l

代わりにそれを作ります:

both(){ ( echo "${@:2}" && "${@:2}" ) | tee "$1" ;}

出力ファイルを上書きせずに追加する場合は、-aオプションをに追加しますtee


9

script端末に出力されるすべてのtypescriptファイルを作成するコマンドを使用できます。フォークされたシェルを作成し、そのシェルが終了するまですべてを記録します。

$ script my_output
Script started on Tue 28 Nov 2017 09:46:15 AM UTC
$ whoami
ajefferiss
$ exit
Script done on Tue 28 Nov 2017 09:46:27 AM UTC

次にcat my_output、同じ出力が得られた場合:

$ cat my_output
Script started on Tue 28 Nov 2017 09:46:15 AM UTC
$ whoami
ajefferiss
$ exit
exit

Script done on Tue 28 Nov 2017 09:46:27 AM UTC

6

シェルのデバッグ機能を一緒に使用できますtee

( set -x; command1 args...; command2 args ) 2>&1 | tee output.log
  • ( ... )サブシェル内で実行されたすべてのコマンドの出力ストリームを「収集」できるサブシェルを開始します。またset、このサブシェルに対する以下のコマンドの効果も含まれています。

  • set -xxシェルが実行するすべてのコマンドを実行前に標準エラーストリームに出力するシェルオプションを有効にします。

  • 2>&1 ストリーム2(標準エラー)をストリーム1(標準出力)にリダイレクトします。

  • | 左のコマンドの標準出力ストリームを右のコマンドの標準入力ストリームにリダイレクトします。

  • tee FILE標準入力ストリームをファイルFILEと標準出力にコピーします。

コマンドシーケンスが既にスクリプトファイルにある場合は、次のように実行する方が理にかなっています。

bash -x /path/to/script args... 2>&1 | tee output.log
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.