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

swa*_*wam 2 shell bash shell-script 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

....
Run Code Online (Sandbox Code Playgroud)

Cel*_*ada 8

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

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

当第二次cat <&0运行时,标准输入上没有任何东西可以消耗:之前已经到达文件末尾。

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

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

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


che*_*ner 5

如果你想从标准输入读取两次,你需要以某种方式缓冲它(很可能,在一个临时文件中)。第一个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 
Run Code Online (Sandbox Code Playgroud)