Saya memiliki beberapa fungsi yang didefinisikan dalam mode ini:
function f {
read and process $1
...
echo $result
}
Saya ingin menyusun mereka bersama sehingga doa akan terlihat seperti f | g | h
.
Idom apa yang harus saya gunakan untuk mengonversi fungsi yang berfungsi pada argumen menjadi satu argumen pembacaan dari stdin? Apakah mungkin untuk membaca pasangan, tupel argumen dari stream tanpa perlu menghindarinya (mis. Null terminating)?
bash
shell-script
pipe
Rumca
sumber
sumber
h(g(f(...)))
atau masing-masing fungsi membaca dari input standar (read x; ...
) dan menulis ke output standar (echo ...
).Jawaban:
Salah satu pendekatan potensial adalah dengan meletakkan
while...read
konstruk di dalam fungsi Anda yang akan memproses data apa pun yang masuk ke fungsi melalui STDIN, beroperasi di atasnya, dan kemudian memancarkan kembali data yang dihasilkan melalui STDOUT.Perawatan harus dihabiskan dengan cara Anda mengkonfigurasi
while ..read..
komponen Anda karena mereka akan sangat bergantung pada jenis data yang mereka dapat konsumsi dengan andal. Mungkin ada konfigurasi optimal yang bisa Anda buat.Contoh
Inilah masing-masing fungsi dengan sendirinya.
Inilah mereka ketika kita menggunakannya bersama.
Mereka dapat mengambil berbagai gaya input.
sumber
Sebagai tambahan untuk jawaban slm , saya melakukan beberapa percobaan dengan tuple yang dipisahkan nol sebagai argumen fungsi:
Catatan:
sayTuple
dua kali membaca catatan tanpa-penghentian yang-d $'\0'
menangani semua ruang di sekitar inputIFS=
.echo
catatan belakang dikelilingi oleh-
Hasil menunjukkan dengan benar menangani input nol-terminated yang berisi
\n
dan\t
:Silakan tambahkan saran untuk peningkatan komentar, ini adalah topik yang menarik.
sumber
sayTuple() { arr=() ; while IFS= read -r -d $'\0' arg; do arr+="$arg"; done; echo "sayTuple: ${arr[@]}"; }
.IFS= read -r -d $'\0' -a arg
tetapi saya tidak bisa melakukan ini. Ini akan memungkinkan untuk penghapusanwhile
, yang tampaknya tidak perlu, tetapi satu-satunya pola saya bisa mulai bekerja.