使用命名管道将一个 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
循环的语法被无可救药地搞砸了;你放弃了 read
; echo
仍然缺少变量周围的引号;然后你反复重新打开管道。
while [ "$input" != "exit" ]
do
read -r input
echo "$input"
done <pipe1
将整个循环重定向一次会显着提高效率。
另请注意选项 -r
以防止 read
对其读取的值执行任何解析。 (丑陋的默认行为是过去遗留下来的,不幸的是,如果不破坏现有脚本就无法修复。)
我是 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
循环的语法被无可救药地搞砸了;你放弃了read
;echo
仍然缺少变量周围的引号;然后你反复重新打开管道。
while [ "$input" != "exit" ]
do
read -r input
echo "$input"
done <pipe1
将整个循环重定向一次会显着提高效率。
另请注意选项 -r
以防止 read
对其读取的值执行任何解析。 (丑陋的默认行为是过去遗留下来的,不幸的是,如果不破坏现有脚本就无法修复。)