Katakanlah saya memiliki perintah foo
yang membutuhkan argumen nama file: foo myfile.txt
. Mengganggu, foo
tidak membaca dari input standar. Alih-alih file yang sebenarnya, saya ingin meneruskannya hasil dari perintah lain (pada kenyataannya pv
,, yang akan menampilkan file dan menampilkan meteran kemajuan sebagai efek samping).
Apakah ada cara untuk mewujudkannya? Sepertinya tidak ada trik yang bisa saya lakukan.
( foo
dalam hal ini adalah skrip PHP yang saya percaya memproses file secara berurutan).
Saya menggunakan Ubuntu dan Bash
EDIT Maaf untuk uraian masalah yang sedikit tidak jelas, tapi inilah jawabannya yang melakukan apa yang saya inginkan:
pv longfile.txt | foo /dev/stdin
Sangat jelas sekarang saya melihatnya.
Jawaban:
Jika saya mengerti apa yang ingin Anda lakukan dengan benar, Anda dapat melakukannya dengan fitur substitusi perintah bash:
Ini melakukan sesuatu yang mirip dengan apa yang
mkfifo
disarankan oleh jawaban, kecuali bahwa bash menangani detail untuk Anda (dan akhirnya mengirimkan sesuatu seperti / dev / fd / 63 ke perintah, daripada pipa bernama biasa). Anda juga dapat melakukannya secara lebih langsung seperti ini:sumber
pv inputfile.txt | foo /dev/stdin
persis apa yang saya cari, tetapi tidak terpikirkan.<(.)
bekerja untukku. Apakah sintaks ini didokumentasikan dalam manual Bash? Saya mengerti(.)
sebagai substitusi perintah didokumentasikan, tetapi tidak melihat kombinasi dengan<
dijelaskan.mkfifo
.sumber
Pertanyaan Unix SE ini memiliki jawaban yang menunjukkan cara membuat pipa bernama sementara:
Shell Script mktemp, apa metode terbaik untuk membuat pipa bernama sementara?
Berdasarkan jawaban di sana, Anda dapat melakukan sesuatu seperti berikut:
Anda kemudian dapat menonton pipa dengan:
Kemudian hapus ketika Anda selesai dengan itu.
sumber
Coba gunakan mkfifo.
Di shell lain, jalankan foo file_read_by_foo
sumber
xargs
tampaknya bekerja dengan baik untuk ini:sumber
pv
beberapa kali, masing-masing dengan satu atau lebih garis yang diambillongfile.txt
. Sama sekali tidak seperti yang saya kejar di sini.