我有一个脚本,可以输出各种信息和 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