GNU/Linux >> Belajar Linux >  >> Linux

Bash Echo Baris Perintah Dieksekusi Di Baris Perintah Itu Sendiri (bukan Dalam Script)?

Untuk keperluan dokumentasi, saya bermaksud mengarahkan ulang ke file stdout dan stderr dari perintah yang saya jalankan.
Misalnya, saya akan menjalankan (perintah saya kurang sepele daripada alias ll tapi mungkin tidak masalah):

$ 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
...

Juga untuk keperluan dokumentasi, saya ingin menyimpan dalam file keluaran yang sama dengan baris perintah yang saya gunakan.
Perilaku dan keluaran yang dimaksud adalah

$ [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
...

Bagaimana ini bisa dilakukan?
Saya tahu saya dapat menulis skrip bash dan menjalankannya, sehingga perintah akan tetap didokumentasikan secara terpisah.
Saya selanjutnya dapat menulis skrip untuk menggemakan baris perintah ke file dan kemudian menjalankannya dengan pengalihan ke yang sama file.
Saya mencari kemungkinan solusi tanpa skrip.

EDIT :
Umpan balik tentang jawaban yang bagus.
Ini tidak cocok sebagai komentar.

Saya menguji dengan perintah echo_command ll echo_command.sh ../dir > out-err.dat 2>&1 .

Skrip echo_command.sh , yang saya source , berisi definisi fungsi.

../dir adalah direktori yang tidak ada, untuk memaksa beberapa keluaran ke stderr .

Metode 1 :
Berfungsi dengan baik, kecuali untuk dua masalah:

  • Tidak mengerti alias (ll pada kasus ini; saat mengganti dengan ls berhasil).

  • Itu tidak merekam bagian pengalihan.

Metode 2 :
Ini tidak bekerja dengan baik. Sekarang bagian pengalihan juga dicetak, tetapi baris perintah dicetak ke layar alih-alih diarahkan ke file.

EDIT :
Umpan balik pada komentar yang diposting, tentang script utility.
Cukup serbaguna, terlebih lagi dengan scriptreplay .

script dapat dipanggil sendiri, yang menghasilkan shell interaktif (tidak akan menyimpan riwayat terbaru dari shell induk)

Itu juga bisa disebut sebagai script -c <command> <logfile> . Formulir terakhir ini sesuai dengan tujuan OP, tetapi tidak menyimpan perintah itu sendiri ke dalam file log. Ini menghasilkan (setidaknya dalam kasus dasar) output yang sama dengan <command> > <logfile> 2>&1 .

Jadi sepertinya ini tidak berguna di sini.

Jawaban yang Diterima:

Anda dapat menggunakan fungsi seperti ini:

echo_command() { printf '%sn' "${*}"; "${@}"; }

Contoh:

$ echo_command echo foo bar baz
echo foo bar baz
foo bar baz
$ echo_command uname
uname
Linux

Seperti yang dikatakan Tim Kennedy, ada juga script yang sangat berguna perintah:

$ 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

Perbarui

Jika Anda juga perlu mencatat pengalihan dan pada dasarnya setiap sintaks shell (perhatikan bahwa saya menambahkan sedikit Command line: pesan untuk dengan mudah mengidentifikasi perintah yang sedang dieksekusi):

echo_command() {
  local arg
  for arg; do
    printf 'Command line: %sn' "${arg}"
    eval "${arg}"
  done
}

Perhatikan saja bahwa Anda harus sangat berhati-hati dengan kutipan sebagai eval digunakan:

$ echo_command 'echo foo > "file 2"; cat "file 2"'
Command line: echo foo > "file 2"; cat "file 2"
foo

Itu juga menerima banyak perintah sekaligus, bukan hanya satu:

$ 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. Kiat bash untuk sehari-hari di baris perintah

  2. Lewati Argumen Baris Perintah ke Skrip Bash?

  3. Perintah Rm Dalam Skrip Bash Tidak Bekerja Dengan Variabel?

  1. echo:perintah tidak ditemukan

  2. Menghasilkan hash SHA-256 dari baris perintah Linux

  3. Skrip Bash mencetak Perintah Tidak Ditemukan pada baris kosong

  1. Perintah "eval" Di Bash?

  2. Bagaimana Cara Melihat Baris Perintah yang Tepat Dieksekusi Di Dalam Beberapa Instance Bash?

  3. bash sh - perintah tidak ditemukan