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
.