管道以及如何在 bash 中使用它们

管道以及如何在 bash 中使用它们

我在一些脚本中看到这样的命令:/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

相关内容