Sudah diketahui dengan baik cara menyalurkan output standar dari suatu proses ke input standar proses lain:
proc1 | proc2
Tetapi bagaimana jika saya ingin mengirim kesalahan standar proc1 ke proc2 dan membiarkan keluaran standar pergi ke lokasinya saat ini? Anda akan berpikir bash
akan memiliki perintah di sepanjang baris:
proc1 2| proc2
Tapi, sayang, tidak. Apakah ada cara untuk melakukan ini?
rc
, yang merupakan shell lain. Misalnya:proc1 |[2] proc2
. Bukankah itu bagus? Tapi tidakbash
.Jawaban:
Ada juga substitusi proses . Yang membuat proses menggantikan file.
Anda dapat mengirim
stderr
ke file sebagai berikut:Tetapi Anda dapat mengganti proses untuk file sebagai berikut:
Berikut adalah contoh konkret yang dikirim
stderr
ke layar dan ditambahkan ke logfilesumber
weston --help 2> >(less)
), dan itu merusak cangkang saya, saya harus keluar dan masuk kembali.weston --help
danless
mengharapkan untuk memiliki interaksi keyboard tetapi hanya 1 dari mereka yang menerimanya, maka Anda mungkin berada dalam situasi yang canggung. Coba lakukan pengujian dengan sesuatu sepertigrep
. Plus Anda mungkin menemukan bahwa kedua input mouse / keyboard akan tetap ke perintah ke-2 daripada ke weston.|&
, saya mempelajarinya dari siniAnda dapat menggunakan trik berikut untuk menukar
stdout
danstderr
. Kemudian Anda hanya menggunakan fungsi pipa biasa.Disediakan
stdout
danstderr
keduanya menunjuk ke tempat yang sama di awal, ini akan memberi Anda apa yang Anda butuhkan.Apa yang dilakukan
x>y
bit adalah mengubah pegangan filex
sehingga sekarang mengirimkan informasinya ke tempat pegangan filey
saat ini menunjuk. Untuk kasus khusus kami:3>&1
membuat pegangan baru3
yang akan menampilkan pegangan saat ini1
(stdout asli), hanya untuk menyimpannya di suatu tempat untuk poin terakhir di bawah.1>&2
memodifikasi pegangan1
(stdout) menjadi keluaran ke pegangan saat ini2
(stderr asli).2>&3-
memodifikasi pegangan2
(stderr) menjadi keluaran ke pegangan saat ini3
(stdout asli) kemudian menutup pegangan3
(melalui-
di akhir).Ini secara efektif adalah perintah swap yang Anda lihat dalam algoritma pengurutan:
sumber
1>&2-
sini daripada hanya1>&2
? Saya tidak mengerti mengapa kami ingin menutup fd2
, jika kami hanya akan membuka kembali / menetapkan ulang segera.Bash 4 memiliki fitur ini:
zsh juga memiliki fitur ini.
-
Dengan shell lain / lama, masukkan saja ini secara eksplisit sebagai
Perintah Pertama 2> & 1 | Perintah Lain
sumber
OtherCommand
menulis data gabungan di suatu tempat, mungkin di tempat lain. Jadi ini bukan data yang sama, dan berpotensi pergi ke tempat lain. Itu berkebalikan dengan keinginan OP, bukan?proc1
output ke stdout dan ke stderr dan Anda ingin stderr pergi ke stdinproc2
(yang mana stdout proc1 akan berjalan), maka jawaban saya menyelesaikannya. Aku memberikan OP apa yang dia minta untuk, mungkin tidak apa yang dimaksudkan untuk meminta. Disinilah potensi ambiguitas. OP menerima jawaban yang menukar stdout dan stderr yang bukan yang dia minta.Pertukaran itu bagus karena menyelesaikan masalah. Kalau-kalau Anda bahkan tidak memerlukan stdout asli, Anda dapat melakukannya dengan cara ini:
Urutan itu penting; Anda tidak ingin:
Karena ini akan mengarahkan semuanya ke
/dev/null
!sumber
Tak satu pun dari ini benar-benar bekerja dengan baik. Cara terbaik yang saya temukan untuk melakukan apa yang Anda inginkan adalah:
(command < input > output) 2>&1 | less
Ini hanya berfungsi untuk kasus di mana
command
tidak memerlukan input keyboard. misalnya:akan mengurangi kesalahan gzip
sumber