cat STDIN 在脚本中不会工作两次

cat STDIN 在脚本中不会工作两次

我有一个脚本,可以输出各种信息和 html 表单的文本字段(方法 POST)。当我尝试 cat <&0 时,它会正确显示。然而,在接下来的几行中,我再次尝试 cat <&0 ,但没有打印任何内容。我究竟做错了什么?

....
cat <&0
echo Content length is $CONTENT_LENGTH
cat <&0 | sed -e 's/&/\n/g' | cut -d'=' -f2

....

答案1

你没有做错任何事:这是我们应该期待的。

第一个cat <&0消耗标准输入的全部内容,因为这就是它的作用cat:它读取所有输入直到结束。

当第二个cat <&0运行时,标准输入上没有任何内容可供使用:之前已经到达文件末尾。

如果在 shell 脚本中,您需要对标准输入进行 2 次或多次传递,则必须将其转储到临时文件中,然后根据需要多次处理该临时文件。

安全地创建临时文件/tmp并确保在脚本终止或死亡时正确处理它们是留给您的练习:-)

顺便说一句,<&0是不必要的并且什么也不做。它的功能是将标准输入指向文件描述符 0...这是标准输入...根据定义,这是标准输入已经指向的位置!您可以单独执行该命令cat

答案2

如果您想从标准输入读取两次,则需要以某种方式对其进行缓冲(最有可能的是在临时文件中)。第一个cat可以替换为调用,tee该调用还将数据写入文件,第二个调用可以重新读取该文件cat(这也不是必需的;sed可以直接从文件中读取)。

tee > input_buffer  # Copy standard input to a file and standard output
echo Content length is $CONTENT_LENGTH
sed -e 's/&/\n/g' input_buffer | cut -d = -f2 

相关内容