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.