Shell 在不同的命令之间传递初始stdin

Shell 在不同的命令之间传递初始stdin,shell,stream,stdin,Shell,Stream,Stdin,我正在研究编写一个文件,该文件的数据通过stdin传输,但对它的处理方式是,流的第一行用于命名文件,第二行+是文件内容。因此,命令基本上是: printf "foo\nbar" | tail +2 > $(head -1) 上面的问题是,head从stdin接收它的值,但它似乎没有传递到tail,从而生成一个空文件foo 如果我使用: printf "foo\nbar" | tail +2 /dev/stdin > $(head -1 /de

我正在研究编写一个文件,该文件的数据通过stdin传输,但对它的处理方式是,流的第一行用于命名文件,第二行+是文件内容。因此,命令基本上是:

printf "foo\nbar" | tail +2 > $(head -1)
上面的问题是,
head
从stdin接收它的值,但它似乎没有传递到
tail
,从而生成一个空文件
foo

如果我使用:

printf "foo\nbar" | tail +2 /dev/stdin > $(head -1 /dev/stdin)

因此,我想知道是否有任何方法可以在多个命令中以不冗长的方式使用初始stdin?

考虑一个小型shell脚本

#! /bin/sh
read filename
cat > $filename

通过shell读取具有无缓冲读取的优点。一些实用程序将以缓冲模式读取,这可能会消耗第一行以外的一些数据。

考虑一个小型shell脚本

#! /bin/sh
read filename
cat > $filename

通过shell读取具有无缓冲读取的优点。一些实用程序将以缓冲模式读取,这可能会消耗第一行以外的一些数据。

这真是太聪明了,谢谢。如果您不介意的话,请您从shell脚本内部扩展它的工作原理,而不是像这样的内联命令:
printf“foo\nbar”| read f;cat>“$f”
在这种情况下,
f
为空?我正在努力熟悉你提到的原因之一是什么?感谢您使用内联命令,您需要将“read”和“cat”组合在一起。否则,它将执行两个命令“printf | read”和“cat”,作为单独的命令。使用:
printf“foo\nbar”{read f;cat>$f;}
这真是太聪明了,谢谢。如果您不介意的话,请您从shell脚本内部扩展它的工作原理,而不是像这样的内联命令:
printf“foo\nbar”| read f;cat>“$f”
在这种情况下,
f
为空?我正在努力熟悉你提到的原因之一是什么?感谢您使用内联命令,您需要将“read”和“cat”组合在一起。否则,它将执行两个命令“printf | read”和“cat”,作为单独的命令。使用:
printf“foo\nbar”{read f;cat>$f;}