在bash中重定向管道输出
在bash中运行此命令在bash中重定向管道输出,bash,Bash,在bash中运行此命令 echo hello | > ./out 文件/out为空,未打印任何内容 所以我想知道,这里到底发生了什么?我认为这是一个错误 谢谢, 这相当于: echo| true 总之,管道输出连接到一个子shell,但是像这样的重定向操作符是shell首先要执行的,并且由于没有对这个子shell的初始输入,您将得到一个空的a.out 即使是echo xxx |>a.out也会给你一个空的a.out文件 更清楚地说,>管道右侧的a.out表示子shell。在处理任何管道输
echo hello | > ./out
文件/out
为空,未打印任何内容
所以我想知道,这里到底发生了什么?我认为这是一个错误
谢谢,
这相当于:
echo| true
总之,管道输出连接到一个子shell,但是像
这样的重定向操作符是shell首先要执行的,并且由于没有对这个子shell的初始输入,您将得到一个空的a.out
即使是echo xxx |>a.out
也会给你一个空的a.out文件
更清楚地说,>管道右侧的a.out
表示子shell。在处理任何管道输入之前,此子shell将首先执行重定向操作符
因此,问题的标题是错误的,您没有使用此命令重定向此处的任何管道输出。您只重定向在管道右侧调用的子shell的输出。文档中只有
&
,
,您想实现什么?我通常会看到像echo hello>out
这样的问题。请注意,堆栈溢出的范围是有限的,仅限于“实际的、可回答的”问题。为没有人会有意编写的代码定义行为是不切实际的,特别是当该行为未定义且可能在未通知的情况下更改时;对于未定义的行为,唯一正确的答案是“不要编写这样做的代码”。我不确定是否准确地说,>a.out
意味着一个子shell,即使在依赖于管道的情况下进行了警告——在管道的右侧有任何命令意味着一个子shell,甚至没有重定向。@CharlesDuffy我从“这相当于echo | true
开始,但我不确定这对于OP来说是可以理解的。这主要是指OP,重定向的右侧在任何情况下都意味着一个子shell。你认为我应该回到“等价于echo | true
”吗(如果重定向失败,则为假)?我确实认为,您最初描述它的方式不太容易被错误理解。(它可能根本不被理解,但我认为这比认为一个人理解但实际上是错误的要好)。@CharlesDuffy我明白您的意思,我将编辑答案。