singkatan untuk mengumpankan konten beberapa file ke stdin skrip


20

Katakanlah saya memiliki skrip bernama script, yang membaca dari stdindan memuntahkan beberapa hasil ke layar.

Jika saya ingin memberinya konten dari satu file, saya akan mengetik:

$ ./script < file1.txt

Tetapi bagaimana jika saya ingin memberi makan isi beberapa file ke skrip dengan cara yang sama, apakah itu mungkin? Sejauh ini yang terbaik yang saya hasilkan adalah:

cat file1.txt file2.txt > combined.txt && ./script < combined.txt

Yang menggunakan dua perintah dan membuat file temp. Apakah ada cara untuk melakukan hal yang sama tetapi tidak membuat file gabungan?


Beralihlah ke zshdan Anda akan dapat menjalankan cmd <file1 <file2 ... <fileN;)
don_crissti

Jawaban:


20

Anda dapat menggunakan catdan pipa:

cat file1 file2 file3 ... fileN | ./script

Contoh Anda, menggunakan pipa, dan tidak ada file temp:

join file1.txt file2.txt | ./script

Doh. Sederhana sekali, saya bahkan tidak yakin bagaimana saya tidak menyadarinya sendiri. Terima kasih!
0x4B1D

10
Penggunaan penghargaan kucing yang berguna!
glenn jackman

4
@ Bruce Ediger: Saya berasumsi Anda hanya menunjukkan cara untuk menggunakan jointanpa file temp, tetapi hanya untuk membuatnya jelas bagi pembaca: cat f1 f2tidak menghasilkan output yang sama sepertijoin f1 f2
Peter.O

@ fred, terima kasih telah menunjukkan ini - saya menggunakan joincontoh saya karena saya bermain dengannya sebelumnya; pada kenyataannya, untuk contoh saya saya gunakan cat.
0x4B1D

10

Jika Anda tidak ingin menggunakan pipa, Anda dapat menggunakan pengalihan input dengan substitusi proses:

./script <(cat file1 file2)

3

Untuk menambahkan jawaban @Jonah Braun, jika Anda perlu menambahkan output proses ke dalam skrip Anda juga, yaitu file Anda mungkin tidak ada di disk Anda tetapi diakses melalui URLmenggunakan curlatau alat serupa.

Sesuatu seperti ini dapat digunakan untuk mendapatkan stdoutbanyak proses dan menggunakannya dalam skrip viastdin

Ini akan menjadi skrip untuk menangani input Isi multi-input.sh:

#!/usr/bin/env bash
while read line; do
    echo $line
done

Sekarang ujilah:

$ ./multi-input.sh < <(cat <(echo process 1) <(echo process 2) <(echo process 3))

Keluaran:

process 1
process 2
process 3

<()mengubah proses menjadi filepenggunaan virtual fdjika Anda mau, jadi <diperlukan untuk membacanya. catitu sendiri tidak memerlukannya karena ia melakukan apa yang dilakukannya, menyatukan file, virtual atau nyata.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.