Untuk mengarahkan stdout ke file terpotong di Bash, saya tahu harus menggunakan:
cmd > file.txt
Untuk mengarahkan stdout di Bash, menambahkan ke file, saya tahu harus menggunakan:
cmd >> file.txt
Untuk mengarahkan ulang stdout dan stderr ke file terpotong, saya tahu harus menggunakan:
cmd &> file.txt
Bagaimana cara mengarahkan stdout dan stderr menambahkan ke file? cmd &>> file.txt
tidak bekerja untuk saya.
Jawaban:
Bash mengeksekusi pengalihan dari kiri ke kanan sebagai berikut:
>>file.txt
: Bukafile.txt
dalam mode tambahkan dan redirect kestdout
sana.2>&1
: Redirectstderr
ke "di manastdout
saat ini pergi" . Dalam hal ini, itu adalah file yang dibuka dalam mode append. Dengan kata lain,&1
menggunakan kembali deskriptor file yangstdout
saat ini digunakan.sumber
cmd >>file1 2>>file2
harus mencapai apa yang Anda inginkan.Ada dua cara untuk melakukan ini, tergantung pada versi Bash Anda.
Cara klasik dan portabel ( Bash pre-4 ) adalah:
Cara nonportable, dimulai dengan Bash 4 adalah
(analog dengan
&> outfile
)Untuk gaya pengkodean yang baik, Anda harus
Jika skrip Anda sudah mulai dengan
#!/bin/sh
(tidak peduli apakah itu dimaksudkan atau tidak), maka solusi Bash 4, dan secara umum kode spesifik Bash apa pun, bukanlah cara yang tepat.Ingat juga bahwa Bash 4
&>>
hanya sintaks yang lebih pendek - Bash 4 tidak memperkenalkan fungsionalitas baru atau semacamnya.Sintaksnya (di samping sintaks redirection lainnya) dijelaskan di sini: http://bash-hackers.org/wiki/doku.php/syntax/redirection#appending_redirected_output_and_error_output
sumber
sh
. Anda dapat mengubah shell default dengan menambahkanSHELL=/bin/bash
kecrontab -e
file.Di Bash, Anda juga dapat secara eksplisit menentukan arahan ulang ke file yang berbeda:
Menambahkan akan:
sumber
cmd >log.out 2>&1
. Saya sedang mengedit jawaban saya untuk menghapus contoh pertama.Dalam Bash 4 (serta ZSH 4.3.11):
di luar kotak
sumber
Ini seharusnya bekerja dengan baik:
Ini akan menyimpan semua log di file.txt serta membuangnya di terminal.
sumber
Coba ini
Penggunaan &> x.file Anda berfungsi di bash4. maaf untuk itu : (
Ini dia beberapa tips tambahan.
0, 1, 2 ... 9 adalah deskriptor file dalam bash.
0 singkatan
stdin
, 1 singkatanstdout
, 2 singkatanstderror
. 3 ~ 9 adalah cadangan untuk penggunaan sementara lainnya.Deskriptor file apa pun dapat dialihkan ke deskriptor file lain atau file dengan menggunakan operator
>
atau>>
(tambahkan).Penggunaan: < file_descriptor > > < nama file | & file_descriptor >
Silakan merujuk ke http://www.tldp.org/LDP/abs/html/io-redirection.html
sumber
You_command
ke stdout dan stdoutYou_command
ke fileoutput.log
. Selain itu tidak akan ditambahkan ke file tetapi akan menimpanya.1 > output.log 2>&1
Saya terkejut bahwa dalam hampir sepuluh tahun, belum ada yang memposting pendekatan ini:
Jika menggunakan versi bash yang lebih lama di mana
&>>
tidak tersedia, Anda juga dapat melakukan:Ini menghasilkan subkulit, sehingga kurang efisien daripada pendekatan tradisional
cmd >> file.txt 2>&1
, dan akibatnya tidak akan bekerja untuk perintah yang perlu memodifikasi shell saat ini (misalnyacd
,pushd
), tetapi pendekatan ini terasa lebih alami dan dapat dimengerti oleh saya:Juga, tanda kurung menghapus ambiguitas pesanan, terutama jika Anda ingin mengirim stdout dan stderr ke perintah lain.
sumber
cmd >> file 2>&1
berfungsi di semua shell dan tidak perlu proses ekstra untuk dijalankan.