标准输出重定向后管道的用途是什么?

标准输出重定向后管道的用途是什么?

我正在阅读文档蟹子并看到了我以前从未见过的 shell 重定向然后管道结构:

echo -e 'FROM alpine \nRUN echo "created from standard input"' > Dockerfile | tar -cf - Dockerfile

的输出echo被重定向到Dockerfile,然后据我所知,它永远什么也没有|tar在这种情况下,我总是将命令与&&or结合起来||,所以我想知道在这种情况下使用无管道是否有特殊目的?

答案1

命令行是有效的,并且不是拼写错误。

如果您在 docker 容器内运行以下命令,您可以观察到它可以工作:

docker run -it --rm alpine sh -c 'echo -e "FROM alpine \nRUN echo \"created from standard input\"" > Dockerfile | tar -cf - Dockerfile'

使用以下命令可以观察到相同的行为cat

echo -e 'FROM alpine \nRUN echo "created from standard input"' > Dockerfile | cat Dockerfile

我的猜测是您可能误解了提供给 的选项tar。它不是从标准输入读取,而是写入标准输出。

解释

shell 创建第一个进程 ( echo) 及其 stdout ( Dockerfile),然后创建下一个进程 ( tar)。两个进程都开始运行,并且由于Dockerfile已经存在,tar因此能够开始读取它,并将输出写入标准输出。

在某些情况下,stdout 是一个 tty(正如一些注释所观察到的),因此您必须将 stdout 替换为 tar 可以写入的内容,例如文件 ( Dockerfile.tar)。在不更改原始命令的情况下,只需将输出重定向添加到 tar 命令以写入文件,您将能够观察到相同的结果。

echo -e 'FROM alpine \nRUN echo "created from standard input"' >Dockerfile | tar -cf - Dockerfile >Dockerfile.tar

相关内容