附加2>和>>

时间:2018-06-29 10:36:50

标签: bash shell

为什么某些脚本使用2>而不是>>? 2是>的乘数吗?

3 个答案:

答案 0 :(得分:1)

1 >>和2 >>是特定文件描述符的重定向,在这种情况下为标准输出(文件描述符1)和标准错误(文件描述符2)。 2> 会将脚本中的错误输出到文件。 “ >>” 将命令的输出附加到现有文件。如果文件不存在,它将创建文件,然后将输出添加到文件中。

查看此链接=> https://unix.stackexchange.com/questions/183125/what-does-1-and-2-mean-in-a-bash-script

答案 1 :(得分:0)

对于2>,表示您将标准错误重定向到文件等。

>>表示我们正在尝试进行串联操作。

示例:

没有2>

ls -ld singh_test
ls: cannot access singh_test: No such file or directory

使用2>

ls -ld singh_test 2>/dev/null

答案 2 :(得分:0)

bash中的I / O重定向不是很漂亮,但是非常灵活。

I / O作为“流”运行。标准输入流为0。标准输出为1。错误输出为2。

echo foo将文字字符串“ foo”发送到命令 standard output 流1。您可以像这样重定向:echo foo 1>x,它将在流1中发送数据到名为x的文件。对于此类输出重定向,默认输出为标准输出,因此您通常会看到人们忽略了1,例如:echo foo >x

这意味着您可以分别指定命令的标准输出和错误输出的重定向。

ls -ld . bogus >ok 2>err

这会将成功列出的内容定向到ok中,而将关于bogus的错误消息引导到err中。

默认情况下,>将创建一个文件(如果不存在),但是会默默地截断已经存在的文件。 >>还将创建一个文件(如果该文件不存在),但是会附加到现有数据中而不是被截断。因此,

ls -ld . bogus >ok 2>>err

将创建一个或两个,但是ok中的所有先前内容都将丢失,而err将在文件末尾添加新行。

如果您不希望这种行为,那么set -o noclobber将对其进行更改,以便>将创建一个新文件,但是如果该文件已经存在,则将失败。您可以明确告诉它用noclobber截断>|下的任何现有文件,以备不时之需。

您还可以使用(例如)2>&-关闭流,并使用1>&3创建新的重复项。

有关更完整的参考,请参见here