Saat menggunakan nohup untuk menempatkan perintah untuk menjalankan di latar belakang beberapa dari konten yang muncul di terminal.
cp: error reading ‘/mnt/tt/file.txt’: Input/output error
cp: failed to extend ‘/mnt/tt/file.txt’: Input/output error
Aku ingin menyimpan konten ke sebuah file.
Ada dua output utama sungai di Linux (dan lain OSs), standar output (stdout) dan standar error (stderr). Pesan kesalahan, seperti yang anda lihat, yang dicetak ke standard error. Klasik pengalihan operator (command > file
) hanya mengarahkan output standar, sehingga standar error masih ditampilkan pada terminal. Untuk redirect stderr juga, anda memiliki beberapa pilihan:
command > 2>kesalahan
>keluar
), dan kemudian redirect stderr ke stdout (2>&1
):command >2>&1
bash
dan zsh
dukungan itu, misalnya, tapi sh
dan ksh
tidak):command &> keluar
Untuk informasi lebih lanjut tentang berbagai kontrol dan pengalihan operator, lihat di sini.
Hal pertama yang harus diperhatikan adalah bahwa ada's beberapa cara tergantung pada tujuan dan shell, oleh karena itu hal ini membutuhkan sedikit pemahaman dari beberapa aspek. Selain itu, perintah tertentu seperti waktu
dan strace
menulis output ke stderr secara default, dan mungkin atau mungkin tidak memberikan metode pengalihan khusus untuk perintah yang
Teori dasar di balik pengalihan adalah proses yang ditimbulkan oleh shell (dengan asumsi itu adalah perintah eksternal dan bukan shell built-in) yang dibuat melalui fork()
dan execve()
saat, dan sebelum itu terjadi lagi syscall dup2()
perlu melakukan pengalihan sebelum execve()
terjadi. Dalam arti bahwa, pengalihan diwariskan dari orang tua shell. M&>n
dan m>n.txt
menginformasikan shell tentang cara untuk melakukan open()
dan dup2()
syscall (lihat juga Cara input redirection bekerja, Apa perbedaan antara redirection dan pipe, dan Apa & persis berarti dalam output redirection )
Yang paling khas, adalah melalui 2>
di Bourne-seperti kerang, seperti dash
(yang merupakan symlink ke /bin/sh
) dan bash
; pertama adalah default dan POSIX-compliant shell dan yang lainnya adalah apa yang sebagian besar pengguna menggunakan untuk sesi interaktif. Mereka berbeda dalam sintaks dan fitur, tapi untungnya bagi kita kesalahan aliran pengalihan bekerja sama (kecuali &>
non standar). Dalam kasus csh dan turunannya, yang redireksi stderr doesn't cukup bekerja di sana.
Let's datang kembali ke 2>
bagian. Dua hal penting untuk melihat: >
berarti pengalihan operator, di mana kita membuka file dan 2
integer singkatan stderr file deskriptor; sebenarnya ini adalah persis bagaimana standar POSIX untuk shell bahasa mendefinisikan pengarahan dalam bagian 2.7:
[n]redir-op word
Secara sederhana >
pengalihan, 1
integer tersirat untuk stdout
, yaitu echo Hello World > /dev/null
adalah sama seperti echo Halo Dunia 1>/dev/null
. Catatan, bahwa integer atau pengalihan operator tidak dapat dikutip, jika shell doesn't mengenali mereka seperti itu, dan bukannya memperlakukan sebagai literal string teks. Adapun jarak, it's penting bahwa bilangan bulat adalah tepat di sebelah pengalihan operator, tapi file yang dapat menjadi berikutnya untuk pengalihan operator atau tidak, yaitu perintah 2>/dev/null
dan perintah 2> /dev/null
akan bekerja dengan baik.
Agak sintaks sederhana untuk khas perintah di shell akan
command [arg1] [arg2] 2> /dev/null
Kuncinya di sini adalah bahwa pengalihan dapat muncul di mana saja. Yang kedua 2> perintah [arg1]
dan perintah 2> [arg1]
yang berlaku. Perhatikan bahwa untuk bash
shell, tidak ada &>
cara untuk mengarahkan kedua stdout dan stderr sungai pada waktu yang sama, tapi lagi - itu's bash tertentu dan jika anda're berjuang untuk portabilitas script, hal itu mungkin tidak bekerja. Lihat juga Ubuntu Wiki dan Apa perbedaan antara &> dan 2>&1.
Catatan: >
pengalihan operator memotong file dan menimpa itu, jika ada berkas. 2>>
dapat digunakan untuk menambahkan stderr
untuk file.
Jika anda perhatikan, >
dimaksudkan untuk satu perintah. Untuk script, kita bisa redirect stderr stream dari seluruh naskah dari luar seperti dalam myscript.sh 2> /dev/null
atau kita dapat menggunakan exec built-in. Exec built-in memiliki kekuatan untuk rewire aliran untuk seluruh sesi shell, sehingga untuk berbicara, baik secara interaktif atau melalui script. Sesuatu seperti
#!/bin/sh
exec 2> ./my_log_file.txt
stat /etc/non_existing_file
Dalam contoh ini, file log harus menunjukkan stat: cannot stat '/etc/non_existing_file': No such file or directory
.
Cara lain adalah melalui fungsi-fungsi. Sebagai kopciuszek disebutkan dalam jawaban-nya, kita dapat menulis deklarasi fungsi dengan sudah terpasang pengalihan, yang
some_function(){
command1
command2
} 2> my_log_file.txt
Perintah seperti waktu
dan strace
menulis output mereka ke stderr secara default. Dalam kasus waktu
perintah, satu-satunya alternatif adalah untuk mengarahkan output dari seluruh perintah , yang
time echo foo 2>&1 > file.txt
atau, sinkron daftar atau subkulit dapat diarahkan jika anda ingin memisahkan output ( seperti yang ditunjukkan dalam related post ):
{ time sleep 1 2> sleep.stderr ; } 2> time.txt
Perintah lain, seperti strace
atau dialog
menyediakan cara untuk redirect stderr. strace
telah -o <filename.txt>
pilihan yang memungkinkan menentukan nama file dimana output harus ditulis. Ada juga pilihan untuk menulis textfile untuk masing-masing subproses yang strace
melihat. Dialog
perintah menulis teks antarmuka pengguna ke stdout tapi output ke stderr, sehingga dalam rangka untuk menyimpan output untuk variabel ( karena var=$(...)
dan pipa yang hanya menerima stderr ) kita perlu untuk swap file deskriptor
result=$(dialog --inputbox test 0 0 2>&1 1>/dev/tty);
tapi selain itu, ada --output-fd
bendera, yang kita juga dapat memanfaatkan. Ada's juga metode bernama pipa. Saya sarankan membaca terkait posting tentang dialog
perintah untuk deskripsi menyeluruh tentang apa's terjadi.