Pertanyaan Cara mengalihkan stderr ke file [duplikat]


Pertanyaan ini sudah memiliki jawaban di sini:

Saat menggunakan nohup untuk menempatkan perintah untuk berjalan di latar belakang, beberapa konten muncul di terminal.

cp: error reading ‘/mnt/tt/file.txt’: Input/output error
cp: failed to extend ‘/mnt/tt/file.txt’: Input/output error

Saya ingin menyimpan konten itu ke file.


161
2018-05-18 12:31


asal




Jawaban:


Ada dua aliran keluaran utama di Linux (dan OS lainnya), keluaran standar (stdout) dan kesalahan standar (stderr). Pesan kesalahan, seperti pesan yang Anda tunjukkan, dicetak ke kesalahan standar. Operator pengalihan klasik (command > file) hanya mengalihkan output standar, sehingga kesalahan standar masih ditampilkan di terminal. Untuk mengalihkan stderr juga, Anda memiliki beberapa pilihan:

  1. Alihkan stdout ke satu file dan stderr ke file lain:

    command > out 2>error
    
  2. Alihkan stderr ke stdout (&1), dan kemudian redirect stdout ke file:

    command >out 2>&1
    
  3. Alihkan keduanya ke file:

    command &> out
    

Untuk informasi lebih lanjut tentang berbagai operator kontrol dan redireksi, lihat sini.


262
2018-05-18 12:50



Begitu hashdeep -rXvvl -j 30 -k checksums.txt /mnt/app/ >> result_hashdeep.txt 2> error_hashdeep.txt & atau hashdeep -rXvvl -j 30 -k checksums.txt /mnt/app/ >> result_hashdeep.txt 2>&1 atau hashdeep -rXvvl -j 30 -k checksums.txt /mnt/app/ &> result_mixed.txt - André M. Faria
@ AndréM.Faria ya. Tetapi dua perintah terakhir adalah setara, mereka akan mengirim kesalahan dan output ke file yang sama. - terdon♦
Seperti pada tautan yang Anda berikan, saya dapat menggunakan | & bukannya 2> & 1 sama, terima kasih untuk waktu Anda. - André M. Faria
Hai, saya bisa menyederhanakan ini menjadi: command 2> out. - Surya Teja Karra
@SuryaTejaKarra yang hanya mengarahkan ulang stderr, tetapi tidak stdout. - terdon♦


Hal pertama yang perlu diperhatikan adalah bahwa ada beberapa cara tergantung pada tujuan dan cangkang Anda, oleh karena itu ini memerlukan sedikit pemahaman tentang berbagai aspek. Paling tipikal, adalah melalui 2> di Cangkang seperti Bourne, seperti dash (yang di-symlink ke /bin/sh) dan bash; pertama adalah shell default dan POSIX-compliant dan yang lainnya adalah apa yang kebanyakan pengguna gunakan untuk sesi interaktif. Mereka berbeda dalam sintaks dan fitur, tapi untungnya bagi kita pengalihan aliran kesalahan bekerja sama (kecuali &> yang tidak standar). Dalam kasus csh dan turunannya, redirection stderr tidak cukup berfungsi di sana.

Mari kembali ke sini 2> bagian. Dua hal penting untuk diperhatikan: > berarti operator redirection, di mana kami membuka file dan 2 integer adalah singkatan dari file deskriptor stderr; sebenarnya ini persis bagaimana standar POSIX untuk bahasa shell mendefinisikan pengalihan dalam bagian 2.7:

[n]redir-op word

Untuk sederhana > pengalihan, yang 1 bilangan bulat disiratkan untuk stdout, i.e. echo Hello World > /dev/null sama saja echo Hello World 1>/dev/null. Perhatikan, bahwa integer atau operator redirection tidak dapat dikutip, jika tidak shell tidak mengenali mereka seperti itu, dan sebaliknya memperlakukan sebagai string teks literal. Untuk spasi, penting bahwa integer tepat di sebelah operator redirection, tetapi file dapat berada di sebelah operator redirection atau tidak, yaitu command 2>/dev/null dan command 2> /dev/null akan bekerja dengan baik.

Sintaks yang agak disederhanakan untuk perintah umum di shell akan

 command [arg1] [arg2]  2> /dev/null

Kuncinya di sini adalah bahwa pengalihan dapat muncul di mana saja. Itu keduanya 2> command [arg1] dan command 2> [arg1] valid. Perhatikan bahwa untuk bash shell, di sana ada &> cara untuk mengarahkan kedua aliran stdout dan stderr pada saat yang sama, tetapi sekali lagi - itu bash spesifik dan jika Anda berusaha untuk portabilitas skrip, mungkin tidak berfungsi. Lihat juga Wiki Ubuntu dan Apa perbedaan antara &> dan 2> & 1.

catatan: Itu > operator redirection memotongfile dan menimpa itu, jika file itu ada. Itu 2>> dapat digunakan untuk menambahkan stderr untuk file.

Jika Anda perhatikan, > dimaksudkan untuk satu perintah tunggal. Untuk skrip, kami dapat mengalihkan aliran stderr dari seluruh skrip dari luar seperti di myscript.sh 2> /dev/null atau kita bisa memanfaatkannya exec built-in. Exec built-in memiliki kekuatan untuk rewire stream untuk seluruh sesi shell, jadi untuk berbicara, apakah secara interaktif atau melalui skrip. Sesuatu seperti

#!/bin/sh
exec 2> ./my_log_file.txt
stat /etc/non_existing_file

Dalam contoh ini, file log harus ditampilkan stat: cannot stat '/etc/non_existing_file': No such file or directory.

Namun cara lain adalah melalui fungsi. Sebagai kopciuszek dicatat dalam jawabannya, kita dapat menulis deklarasi fungsi dengan pengalihan yang sudah terpasang, yaitu

some_function(){
    command1
    command2
} 2> my_log_file.txt

4
2018-05-03 07:48