从这个高票数的评论到终端命令中的 `>>` 是什么意思?:
“程序在前面”是什么意思?显然是命令,但重定向也可以写在前面,即
>> file command
我不记得见过这种情况——尽管从点赞数量来看,这种情况显然存在。我只见过并使用过以下格式的重定向命令
command >> file
当使用>>
及其同类词时(即2>
,2>&1
等等)。
您何时以及为什么要反转顺序?这是否意味着所有内容stdout
都被重定向,而不仅仅是来自command
?有人有具体的例子吗?
我有一个谷歌并能找到任何直接的例子。
答案1
>> file command
这是否意味着所有内容stdout
都被重定向,而不仅仅是来自命令的内容?
这样的重定向会影响一个简单的命令。从man 1 bash
:
在执行命令之前,可以使用 shell 解释的特殊符号重定向其输入和输出。[…] 以下重定向运算符可以位于简单命令之前或内部的任何位置,也可以位于命令之后。重定向按其出现的顺序从左到右进行处理。
“以下重定向运算符”为[n]<word
,,等等[n]>word
。[n]>>word
简单命令是一系列可选变量分配,后跟空格分隔的单词和重定向,并由控制运算符终止。
和
控制运算符
执行控制功能的标记。它是以下符号之一:
||
&
&&
;
;;
(
)
|
|&
<newline>
这意味着以下命令是等效的:
echo Some text >> file
echo Some >> file text
echo >> file Some text
>> file echo Some text
问题已加标签狂欢和我引用的man 1 bash
,但上面的命令sh
也有效。
命令行解析器需要在运行命令之前“提供”所有重定向(即命令删除这些重定向)。想想看,无论特定重定向在哪里,过程都是相同的。没有理由要求它位于最后。
您何时以及为何要撤销该订单?
我不记得有哪种情况我需要在中间进行重定向。但是,有一种使用情况是,在开始时进行输入重定向非常有用。请考虑以下代码:
grep foo file | tail | …
假设管道很长。它发布在超级用户上并解决了一些问题。您可以将其粘贴到控制台并运行它。如果您更愿意附加将它传递给某个命令或管道?例如,您想要获取:
my_custom_command | grep foo | tail | …
# ^^^^^^^^^^^^^^^^^^^ this is the part you'd be happy to paste
您需要file
从复制的命令中删除。出于这个原因,一些用户更喜欢发布这样的命令:
cat file | grep foo | tail | …
# ^^^^^^^^^^^^^^^^^^^ it's easy to copy this
# ^^^^^^^^^^^^^^^^^^^^^ or even this
在其他情况下,这将是完全无用的cat
。有些人会说,无论情况如何,它仍然是无用的。那么如何:
< file grep foo | tail | …
# ^^^^^^^^^^^^^^^^^^^ it's easy to copy this
不cat
和一个方便的形式!
答案2
解释
理解 I/O 重定向操作符如何工作的关键是记住您正在一个 shell 中工作,该 shell 会随着您输入的每个命令不断打印到 STDOUT 或 STDERR(主要)。
>>
不在乎如何输出确实发生了,但只有当它发生时,它才能将其附加到紧随其后的文件中。同样重要的是要记住重定向运算符不会参与您的命令。您可以通过输入来进一步测试,echo hello >> newfile this is my output
然后您cat newfile
会看到:“hello,这是我的输出”。
在这个特殊情况下,命令与附加运算符 (>>) 的结合顺序不一定是需要注意的重要事项。相反,要观察结果您的命令,正如 Kamil 在上面的评论中提到的那样。只要您的 shell 中打印的内容不是错误,它就>>
可以完成它的工作。
echo 命令的作用是打印到标准输出 (STDOUT)。单独尝试一下,你会看到输出结果中>> file
有一个新行。如果你将它包含在混合中,那么新行上出现的内容将附加到该文件中。此命令的顺序是但很重要。要附加到的文件必须直接位于运算符之后。
示例说明
至于具体的例子,我想说你不会找到很多,因为改变顺序看起来比从一个源指向另一个源的几个箭头更不直观/可读。此外,当你编写冗长的 shell 脚本时,对直观和可读的代码的需求更大。
如果你希望更深入地了解这一点,你可以开始学习文件描述符(STDIN、STDOUT、STDERR)以及 Unix系统调用工作原理。所有这些都可以看作是了解 Unix 系统编程以及 Unix/Linux 更深层次工作原理的窗口。