Mam kilka zdefiniowanych w ten sposób funkcji:
function f {
read and process $1
...
echo $result
}
Chcę skomponować je razem, aby wyglądało na to wywołanie f | g | h
.
Jakiego idiomu używam do konwersji funkcji działającej na argumentach na jeden odczyt argumentów ze standardowego wejścia? Czy możliwe jest czytanie par, krotek argumentów ze strumienia bez konieczności ucieczki (np. Kończenie na zero)?
bash
shell-script
pipe
Rumca
źródło
źródło
h(g(f(...)))
albo każda z funkcji czyta ze standardowego wejścia (read x; ...
) i zapisuje na standardowe wyjście (echo ...
).Odpowiedzi:
Jednym potencjalnym podejściem byłoby umieszczenie
while...read
konstrukcji w twoich funkcjach, która przetwarzałaby wszelkie dane, które weszły do funkcji przez STDIN, działała na niej, a następnie wysyłała otrzymane dane z powrotem przez STDOUT.Trzeba będzie zachować ostrożność podczas konfigurowania
while ..read..
komponentów, ponieważ będą one wysoce zależne od typów danych, które będą w stanie niezawodnie wykorzystać. Może istnieć optymalna konfiguracja, którą możesz wymyślić.Przykład
Oto każda funkcja sama w sobie.
Oto one, kiedy używamy ich razem.
Mogą przyjmować różne style danych wejściowych.
źródło
Jako dodatek do odpowiedzi SLM przeprowadziłem eksperymenty z krotkami rozdzielonymi zerami jako argumentami funkcji:
Uwagi:
sayTuple
dwukrotnie czyta zapis zakończony zerem,-d $'\0'
obsługujący dowolne miejsce otaczające dane wejścioweIFS=
.echo
archiwum w otoczeniu-
Wynik pokazuje, że poprawnie obsługuje dane wejściowe zakończone znakiem null zawierające
\n
i\t
:Dodaj sugestie dotyczące ulepszenia komentarzy, to ciekawy temat.
źródło
sayTuple() { arr=() ; while IFS= read -r -d $'\0' arg; do arr+="$arg"; done; echo "sayTuple: ${arr[@]}"; }
.IFS= read -r -d $'\0' -a arg
ale nie mogłem tego zrobić. Pozwoliłoby to na usunięcie tegowhile
, co wydaje się niepotrzebne, ale był to jedyny wzór, jaki mogłem dostać do pracy.