gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:47:25 24 4
gpt4 key购买 nike

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

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

文件1.sh:

read var1
echo $var1

文件2.sh:

while [ "$var2" != "exit" ]
do
echo $1
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 脚本中执行此操作的示例。

最佳答案

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

./File2.sh <pipe

此外,您的脚本需要使用正确的变量名和双引号来echo "$var2" 以防止通配符扩展、变量替换等情况发生。另见When to wrap quotes around a shell variable?

your own answer中的代码有几个新问题。

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

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

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

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

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

关于linux - 使用命名管道将一个 shell 脚本的输出作为另一个输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32497732/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com