ドキュメントの目的で、実行するコマンドからファイルstdoutとstderrにリダイレクトすることを意味します。
たとえば、実行します(私のコマンドはエイリアス ll
よりも簡単ではありません。 しかし、それはおそらく問題ではありません):
$ ll > out-err.dat 2>&1
$ cat out-err.dat
drwxr-xr-x 39 us00001 us00001 4096 jul 31 14:57 ./
drwxr-xr-x 3 root root 4096 feb 2 06:06 ../
-rw------- 1 us00001 us00001 62226 jul 31 11:56 .bash_history
...
また、ドキュメントの目的で、使用したコマンドラインを同じ出力ファイルに保存したいと思います。
意図した動作と出力は
$ [NEW COMMAND LINE]?
$ cat out-err.dat
[NEW COMMAND LINE] <- This first line would contain the command line used
drwxr-xr-x 39 us00001 us00001 4096 jul 31 14:57 ./
drwxr-xr-x 3 root root 4096 feb 2 06:06 ../
-rw------- 1 us00001 us00001 62226 jul 31 11:56 .bash_history
...
これはどのように行うことができますか?
bashスクリプトを記述して実行できるので、コマンドは個別に文書化されたままになります。
さらに、コマンドラインをファイルにエコーして同じものにリダイレクトして実行するスクリプトを記述できます。ファイル。
スクリプトを使わない解決策を探しています。
編集 :
良い答えに対するフィードバック。
これはコメントとしては適合しません。
コマンドecho_commandll echo_command.sh ../dir> out-err.dat 2>&1
でテストしました 。
スクリプトecho_command.sh
、私は source
、関数の定義が含まれています。
../ dir
は存在しないディレクトリであり、一部の出力を stderr
に強制します。 。
方法1 :
2つの問題を除いて、うまく機能します:
-
エイリアスを理解していません(
ll
この場合;ls
に置き換える場合 うまくいきました。 -
リダイレクト部分は記録されません。
方法2 :
うまくいきません。これで、リダイレクト部分も印刷されますが、コマンドラインはファイルにリダイレクトされるのではなく、画面に印刷されます。
編集 :
script
に関する投稿されたコメントへのフィードバック ユーティリティ。
これは非常に用途が広く、 scriptreplay
を使用するとさらに用途が広がります。 。
スクリプトコード> 単独で呼び出すことができ、インタラクティブなシェルを生成します(親シェルの最近の履歴は保持されません)
script -c
と呼ぶこともできます 。この最後の形式はOPの目的に対応していますが、コマンド自体はログファイルに保存されません。 (少なくとも基本的なケースでは)
と同じ出力を生成します 。
したがって、これはここでは役に立たないようです。
承認された回答:
次のような関数を使用できます:
echo_command() { printf '%sn' "${*}"; "${@}"; }
例:
$ echo_command echo foo bar baz
echo foo bar baz
foo bar baz
$ echo_command uname
uname
Linux
ティムケネディが言ったように、非常に便利な script
もあります コマンド:
$ script session.log
Script started, file is session.log
$ echo foo
foo
$ echo bar
bar
$ echo baz
baz
$ exit
exit
Script done, file is session.log
$ cat session.log
Script started on 2018-07-31 16:30:31-0500
$ echo foo
foo
$ echo bar
bar
$ echo baz
baz
$ exit
exit
Script done on 2018-07-31 16:30:43-0500
更新
リダイレクトと基本的にすべてのシェル構文もログに記録する必要がある場合(コマンドラインを少し追加したことに注意してください:
実行中のコマンドを簡単に識別するためのメッセージ):
echo_command() {
local arg
for arg; do
printf 'Command line: %sn' "${arg}"
eval "${arg}"
done
}
eval
としての引用には十分注意する必要があることを考慮に入れてください 使用される:
$ echo_command 'echo foo > "file 2"; cat "file 2"'
Command line: echo foo > "file 2"; cat "file 2"
foo
また、1つだけではなく、一度に多くのコマンドを受け入れます。
$ echo_command 'echo foo' 'echo bar' 'echo baz'
Command line: echo foo
foo
Command line: echo bar
bar
Command line: echo baz
baz