我正在阅读文档蟹子并看到了我以前从未见过的 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