Perintah tar normal
tar cvf foo.tar ./foo >foo.out 2>foo.err
memiliki tiga aliran IO output
- arsipkan data ke foo.tar
- daftar nama file ke STDOUT (dialihkan ke foo.out)
- pesan kesalahan ke STDERR (dialihkan ke foo.err)
Saya kemudian dapat memeriksa foo.err untuk pesan kesalahan tanpa harus membaca daftar nama file.
jika saya ingin melakukan sesuatu dengan data arsip (pipa melalui netcat atau program kompresi khusus) saya dapat menggunakan -f -
opsi tar dengan demikian
tar cvf - ./foo 2>foo.err | squish > foo.tar.S
Tapi sekarang daftar nama file saya dicampur dengan pesan kesalahan saya karena -v
output tar jelas tidak bisa pergi ke STDOUT (di situlah data arsip mengalir) jadi tar dengan cerdik menulisnya ke STDERR sebagai gantinya.
Menggunakan Korn shell, apakah ada cara untuk membangun perintah yang menyalurkan aliran arsip ke perintah lain tetapi masih menangkap -v
output secara terpisah dari pesan kesalahan apa pun.
tee
? Ini sepertinya kasus penggunaan yang cukup valid untuk itu.Jawaban:
Jika sistem Anda mendukung
/dev/fd/n
:Yang dengan implementasi AT&T
ksh
(bash
atauzsh
) Anda dapat menulis menggunakan subtitusi proses :Itu melakukan hal yang persis sama kecuali bahwa kali ini, shell memutuskan deskriptor file mana yang akan digunakan
3
(biasanya di atas 9). Perbedaan lainnya adalah bahwa kali ini, Anda mendapatkan status keluartar
alih-alihsquish
. Pada sistem yang tidak mendukung/dev/fd/n
, beberapa shell mungkin menggunakan pipa bernama untuk fitur itu.Jika sistem Anda tidak mendukung
/dev/fd/n
atau shell Anda tidak dapat menggunakan pipa bernama untuk substitusi prosesnya, di situlah Anda harus berurusan dengan pipa bernama dengan tangan .sumber
Anda harus menggunakan pipa bernama untuk itu.
Pertama buat satu di folder:
Kemudian gunakan perintah itu:
Pemberitahuan: yang
cat
-bagian, sekarang dapat juga menjadigzip
atau apa pun, yang dapat membaca dari pipa:Penjelasan:
Output ditulis ke pipa nama (
foo.pipe
), di mana proccess lain (cat
,gzip
,netcat
) membaca dari. Jadi Anda tidak kehilangan saluran stdout / stderr untuk mendapatkan informasi.sumber
umask 077
(atau menggunakan dir temp pribadi) untuk mencegah proses lain membaca atau menulis untuk itu (pada banyak sistem, pipa bernama, seperti file lain yang dibuat dapat dibaca dunia secara default), 2) Anda perlu memastikan pipa bernama hanya digunakan oleh setiap instance skrip Anda (sekali lagi direktori sementara pribadi membantu) 3) Itu berarti Anda perlu membersihkan setelahnya atau jika terganggu.p="/tmp/pipe$$"; mkfifo "$p"; (read na; cmd[s]...) <>"$p" & (echo;rm "$p"; cmd[s]...) >"$p"
--index-file
Opsi tar GNU berfungsi dengan baik:sumber