Saya punya perintah proses awal untuk menampilkan file
./preprocess.sh > preprocessed_file
dan preprocessed_file
akan digunakan seperti ini
while read line
do
./research.sh $line &
done < preprocessed_file
rm -f preprocessed_file
Apakah ada cara untuk mengarahkan output ke while read line
bagian daripada keluaran ke preprocessed_file? Saya pikir harus ada cara yang lebih baik selain menggunakan temp ini preprocessed_file
.
shell
io-redirection
Marcus Thornton
sumber
sumber
<
adalah pengalihan, sedangkan<(...)
sintaksis subtitusi proses. Anda harus membaca: gnu.org/software/bash/manual/html_node/… untuk lebih jelasnya.<(...)
adalah bagian dari sintaksis.read
harus membaca satu byte pada satu waktu, sementara itu dapat mengoptimalkan hal-hal dengan membaca potongan yang lebih besar dan mencari ke belakang ketika membaca dari file biasa. Yang terbaik adalah menghindariwhile read
loop sama sekali di tempat pertama bila memungkinkan. Perhatikan juga bahwa Anda perluIFS= read -r line
membaca baris$line
. Dan meninggalkan tanda$line
kutip (memanggil operator + glob glob) di sini mungkin tidak masuk akal.read
shell builtin membaca satu karakter pada saat membaca dari pipa (terlepas dari apa yang ada di ujung pipa yangread
tidak memiliki cara untuk mengetahui), yang merupakan salah satu alasan mengapawhile read
loop sangat lambat.Iya! Anda dapat menggunakan pipa proses
|
.Pipa proses melewatkan output standar (
stdout
) dari satu proses ke input standar (stdin
) dari proses berikutnya.Anda bisa menempatkan karakter baris baru mengikuti a
|
dan memperluas perintah ke baris berikutnya.Catatan:
a|b
setara denganb < <(a)
, tetapi tanpa file ajaib, dan dalam urutan yang lebih mudah dibaca, terutama ketika pipa menjadi lebih panjang.a|b|c
setara denganc < <(b < <(a))
dan
a|b|c|d|e
adalahe < < (d < <(c < <(b < <(a))))
sumber
$line
ke dalam tanda kutip ganda (misalnya, dalam skrip Anda,./research.sh "$line" &
).research.sh
bekerja dengan array argumen baris perintah dan$line
, misalnya, "satu dua", dengan maksud bahwa argumen pertama menjadi "satu" dan argumen kedua "dua", mengutip$line
akan membuat hal itu tidak mungkin - sebaliknya argumen pertama akan menjadi "satu dua" dan tidak akan ada yang kedua ...a|b
setara denganb < <(a)
" - tutup, tetapi tidak cukup. Dalam versi pipa, kedua sisi pipa dijalankan dalam subkulit, sedangkan dalam versi proses-substitusi, hanya proses tersubstitusi yang dijalankan dalam subkulit, tetapia
dijalankan dalam lingkup level shell yang saat ini sedang dijalankan. Ini memiliki implikasi penting untuk ruang lingkup variabel yang ditetapkan dalama