Pertanyaan Bagaimana saya bisa mengarahkan dan menambahkan kedua stdout dan stderr ke file dengan Bash?


Untuk mengalihkan stdout ke file terpotong di Bash, saya tahu untuk menggunakan:

cmd > file.txt

Untuk mengalihkan stdout di Bash, menambahkan ke file, saya tahu untuk menggunakan:

cmd >> file.txt

Untuk mengarahkan keduanya stdout dan stderr ke file terpotong, saya tahu untuk menggunakan:

cmd &> file.txt

Bagaimana cara mengalihkan keduanya stdout dan stderr menambahkan ke file? cmd &>> file.txt tidak bekerja untukku.


1182
2018-05-18 04:19


asal


Jawaban:


cmd >>file.txt 2>&1

Bash mengeksekusi pengalihan dari kiri ke kanan sebagai berikut:

  1. >>file.txt: Buka file.txt dalam mode tambahan dan pengalihan stdout sana.
  2. 2>&1: Redirect stderr untuk "dimana stdout sedang terjadi ". Dalam hal ini, itu adalah file yang dibuka dalam mode tambahan. Dengan kata lain, itu &1 menggunakan kembali deskriptor file yang stdout saat ini menggunakan.

1559
2018-05-18 04:23



Ada dua cara untuk melakukan ini, tergantung pada versi Bash Anda.

Klasik dan portabel (Bash pra-4) caranya adalah:

cmd >> outfile 2>&1

Cara yang tidak mudah, dimulai dengan Bash 4 aku s

cmd &>> outfile

(analog ke &> outfile)

Untuk gaya pengkodean yang baik, Anda harus

  • memutuskan apakah portabilitas merupakan masalah (kemudian gunakan cara klasik)
  • memutuskan apakah portabilitas bahkan ke Bash pra-4 adalah kekhawatiran (kemudian gunakan cara klasik)
  • tidak peduli sintaks yang Anda gunakan, tidak mengubahnya dalam skrip yang sama (kebingungan!)

Jika skrip Anda sudah dimulai #!/bin/sh (tidak peduli apakah dimaksudkan atau tidak), maka solusi Bash 4, dan secara umum kode Bash-spesifik, bukanlah cara untuk pergi.

Juga ingat bahwa Bash 4 &>> hanya sintaks yang lebih pendek - itu tidak memperkenalkan fungsi baru atau sesuatu seperti itu.

Sintaksnya (disamping sintaks redireksi lainnya) yang dijelaskan di sini: http://bash-hackers.org/wiki/doku.php/syntax/redirection#appending_redirected_output_and_error_output


298
2018-05-18 04:42



Di Bash Anda juga dapat secara eksplisit menentukan pengalihan Anda ke file yang berbeda:

cmd >log.out 2>log_error.out

Menambahkan akan:

cmd >>log.out 2>>log_error.out

76
2017-07-24 18:09



Di Bash 4 (serta ZSH 4.3.11):

cmd &>>outfile

baru keluar dari kotak


57
2018-03-27 18:24



Ini harus berfungsi dengan baik:

your_command 2>&1 | tee -a file.txt

Ini akan menyimpan semua log masuk file.txt serta membuangnya di terminal.


32
2017-12-12 06:17



Coba ini

You_command 1>output.log  2>&1

Penggunaan Anda atas &> x.file berfungsi di bash4. maaf untuk itu : (

Di sini muncul beberapa kiat tambahan.

0, 1, 2 ... 9 adalah deskripsi file dalam bash.

0 kependekan dari stdin, 1 singkatan stdout, 2 kependekan dari stderror. 3 ~ 9 adalah cadangan untuk penggunaan sementara lainnya.

Setiap file descriptor dapat dialihkan ke deskriptor file atau file lain dengan menggunakan operator > atau >>(menambahkan).

Pemakaian: <file_descriptor> > <nama file | & file_descriptor>

Silakan referensi ke http://www.tldp.org/LDP/abs/html/io-redirection.html


19
2018-04-10 05:56