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 denganls
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