“>> 文件命令”起什么作用,它与“命令 >> 文件”有何不同?

“>> 文件命令”起什么作用,它与“命令 >> 文件”有何不同?

从这个高票数的评论终端命令中的 `>>` 是什么意思?

“程序在前面”是什么意思?显然是命令,但重定向也可以写在前面,即>> 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 更深层次工作原理的窗口。

相关内容