使用命名管道将一个 shell 脚本的输出作为另一个脚本的输入

Give output of one shell script as input to another using named pipes

我是 linux 的新手,一直在编写一些初学者级别的 shell 脚本。 我想做的是写 2 个脚本。第一个脚本将读取来自用户的输入,第二个脚本将循环显示此输入,直到它检测到来自用户的 "exit"。

这就是我编写 2 shell 脚本的方式。

File1.sh:

read var1
echo $var1

File2.sh:

while [ "$var2" != "exit" ]
do
  echo 
  read var2
done

现在,我想使用命名管道将 File1.sh 的输出作为输入传递给 File2.sh 的 var1。我可能必须修改 File2.sh 中的代码,以便它接受来自命名管道的参数(而不是 $1 输入将来自命名管道),但我完全不确定如何去关于它。

将File1.sh的输出作为命名管道的输入可以给出如下:

mkfifo pipe
./File1.sh > pipe

此命令一直要求输入,直到我使用 ctrl + c 退出。我不知道为什么会这样。 另外,如何从该管道读取 File2.sh?

这是正确的吗?

pipe|./File2.sh

我是 linux 的新手,但我在网上搜索了很多,在 shell 脚本中甚至没有这样做的例子。

第一个在File1.sh,echo var1应该是echo $var1

为了从 pipe 获得输入,尝试:

./File2.sh < pipe

我就是这样解决的。 我犯的第一个错误是在程序之外声明管道。我所期望的是程序接受类型 "pipe" 的输入参数的特殊方式。据我所知,这是错误的。

您需要做的是在程序中声明管道。所以在读取程序中你所做的是,

对于File1.sh:

pipe1=/Documents
mkfifo pipe1
cat > pipe1

这会将用户的读取输入发送到管道。 现在,当管道打开时,它将继续接受输入。您只能在管道打开时从管道中读取。所以你需要打开第二个终端 window 到 运行 第二个程序。

对于File2.sh:

while("$input" != "exit")
do
     read -r input < pipe1
     echo "$input"
done

因此,每当您在第一个终端 window 中输入一些字符串时,它将反映在第二个终端 window 中,直到检测到 "exit"。

至于你原来的问题,从命名管道(或文件系统中的任何其他对象)读取的语法是

./File2.sh <pipe

此外,您的脚本需要 echo "$var2" 使用正确的变量名和双引号以保护值免受通配符扩展、变量替换等的影响。另请参阅 When to wrap quotes around a shell variable?

中的代码有几个新问题。

  • File1.sh 中,您显然是在尝试声明一个变量 pipe1,但赋值语法是错误的:等号两边不能有空格。因为您永远不会将此变量用于任何事情,所以这基本上是无害的(但会导致 pipe1: command not found,这当然很烦人)。

  • File2.sh中,while循环的语法被无可救药地搞砸了;你放弃了 readecho 仍然缺少变量周围的引号;然后你反复重新打开管道。

while [ "$input" != "exit" ]
do
     read -r input
     echo "$input"
done <pipe1

将整个循环重定向一次会显着提高效率。

另请注意选项 -r 以防止 read 对其读取的值执行任何解析。 (丑陋的默认行为是过去遗留下来的,不幸的是,如果不破坏现有脚本就无法修复。)