GNU/Linux >> Linux の 問題 >  >> Linux

Bash Echoコマンドライン自体で実行されるコマンドライン(スクリプトではない)?

ドキュメントの目的で、実行するコマンドからファイル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の目的に対応していますが、コマンド自体はログファイルに保存されません。 (少なくとも基本的なケースでは) > 2>&1と同じ出力を生成します 。

したがって、これはここでは役に立たないようです。

承認された回答:

次のような関数を使用できます:

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

Linux
  1. コマンドライン引数をBashスクリプトに渡しますか?

  2. 一部のBashインスタンス内で実行されている正確なコマンドラインを確認するにはどうすればよいですか?

  3. Bashでの$#の使用は何ですか

  1. コマンドラインでの毎日のBashのヒント

  2. Bashの「評価」コマンド?

  3. jenkins パイプラインで bash コマンドを実行する

  1. BashスクリプトのRmコマンドは変数では機能しませんか?

  2. vim:コマンドが見つかりません

  3. エコー:コマンドが見つかりません