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

pau*_*ulj 2 bash pipe shell-script

我在一些脚本中看到这样的命令:/bin/cat somefile | someprogram. 我想知道如何像 someprogram 一样读取整个管道。因此,当我运行时 /bin/cat something | myprogram.sh,myprogram.sh 有一个名为 mypipevar 的变量,它等于通过管道传输的任何内容 - 所有管道文本。如果这不清楚,请告诉我。我读过 read 可能不起作用,bash 可能不是正确的 shell。

Mic*_*fin 8

管道将stdout一个程序连接到另一个程序stdin,因此在您的脚本中只需读取即可stdin,您将获得上一个命令打印出来的内容。将其读入变量的一种简单方法是使用 cat ,例如 inside myprogram.sh

mypipevar="$(cat ${1:-/dev/stdin})"
echo "Obtained the value: '$mypipevar'"
Run Code Online (Sandbox Code Playgroud)

然而,很多时候你想一行一行地处理事情而不是一次全部处理,这可以用

while read line
do
  echo "$line"
done < "${1:-/dev/stdin}"
Run Code Online (Sandbox Code Playgroud)

请注意,这${1:-/dev/stdin}将为您提供第一个参数,或者如果未指定任何参数,则/dev/stdin它将包含标准输入的内容,可以像文件一样读取。这允许您将脚本作为command | script或简单地作为script filename.