我在一些脚本中看到这样的命令:/bin/cat somefile | someprogram
。我想知道如何像某些程序一样读取整个管道。因此,当我运行时 /bin/cat something | myprogram.sh
, myprogram.sh 有一个名为 mypipevar 的变量,它等于管道传输的所有内容 - 所有管道文本。如果不清楚,请告诉我。我读到 read 可能不起作用,并且 bash 可能不是正确的 shell。
答案1
管道将stdout
一个程序连接到stdin
另一个程序,因此在您的脚本中只需读取stdin
,您就会得到上一个命令打印出来的内容。将其读入变量的一个简单方法是使用 cat 例如myprogram.sh
:
mypipevar="$(cat ${1:-/dev/stdin})"
echo "Obtained the value: '$mypipevar'"
然而,很多时候你想要逐行处理而不是一次全部处理,这可以通过
while read line
do
echo "$line"
done < "${1:-/dev/stdin}"
请注意,这${1:-/dev/stdin}
将为您提供第一个参数,或者如果未指定参数,则/dev/stdin
它将包含 stdin 的内容,可以像文件一样读取。这允许您以command | script
或者简单地作为 执行脚本script filename
。