Potoki i sposób ich używania w bash

W niektórych skryptach widzę takie polecenia: /bin/cat somefile | someprogram. Chciałbym wiedzieć, jak czytać całą rurkę tak samo, jak robi to jakiś program. Więc kiedy uruchamiam /bin/cat something | myprogram.sh, myprogram.sh ma zmienną o nazwie mypipevar równą temu, co zostało przesłane potokiem – cały tekst potoku. Jeśli jest to niejasne, daj mi znać. Przeczytałem, że odczyt prawdopodobnie nie zadziała, a bash może nie być właściwą powłoką.

Odpowiedź

Potok łączy stdout jednego programu do stdin innego, więc w swoim skrypcie po prostu czytaj z stdin i otrzymasz to, co wydrukowało poprzednie polecenie. Prostym sposobem na odczytanie tego w zmiennej jest na przykład wpisanie cat wewnątrz myprogram.sh:

mypipevar="$(cat ${1:-/dev/stdin})" echo "Obtained the value: "$mypipevar"" 

Jednak całkiem często chcesz przetwarzać rzeczy wiersz po wierszu, a nie wszystkie naraz, można to zrobić za pomocą

while read line do echo "$line" done < "${1:-/dev/stdin}" 

Zauważ, że ${1:-/dev/stdin} poda pierwszy argument lub, jeśli nie podano żadnych argumentów, /dev/stdin, który będzie zawierał zawartość stdin, którą można odczytać jak plik. Pozwala to na wykonanie skryptu jako command | script lub po prostu jako script filename.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *