command 1> out
我看到像或用于重定向 stderr 之类的东西2>&1
,但有时我也会看到&>
它本身,等等。
最好的理解方式是什么&
以及它到底意味着什么?
答案1
&
中的只是2>&1
表示该数字1
是文件描述符而不是文件名。在本例中standard output file descriptor
。
如果您使用2>1
,那么这会将错误重定向到名为的文件1
,但如果您使用2>&1
,那么它会将其发送到standard output stream
。
这&>
表示将standard output
和发送standard error
到某处。例如ls <non-existent_file> &> out.file
。让我用一个例子来说明这一点。
设置:
koko
创建一个包含以下内容的文件:#!bin/bash ls j1 echo "koko2"
使其可执行:
chmod u+x koko
现在注意
j1
不存在现在运行
./koko &> output
运行
cat output
,你就会看到ls: cannot access 'j1': No such file or directory koko2
standard error
( ls: cannot access 'j1': No such file or directory
) 和standard output
( )均已koko2
发送至文件output
。
现在再次运行它,但这次像这样:
./koko > output
执行cat output
后,您只会看到koko2
类似内容。但看不到命令的错误输出ls j1
。这些错误输出将被发送到standard error
您将在终端中看到的。
感谢@Byte Commander 的重要说明:
请注意,command >file 2>&1
重定向的顺序很重要。如果您command 2>&1 >file
改为写入(这通常不是您想要的),它将首先将命令重定向stdout
到文件,然后将命令重定向stderr
到现在未使用的stdout
,因此它将显示在终端中,您可以将其通过管道传输或再次重定向,但它不会被写入文件。
答案2
> FILE 2>&1
和&> FILE
是等价的。参见8.2.3.2. 错误重定向在Bash 初学者指南第 8 章
答案3
被[n]>&word
称为复制输出文件描述符(看第 2.7.6 节POSIX Shell 语言标准)。这种特殊行为是 Bourne 类 Shell 的特征,包括ksh
、dash
和bash
;事实上,该标准基于 Bourne shell 和ksh
。深入研究tcsh和韓軟體手册,它们显然不提供复制任何文件描述符的能力,但是从的描述来看>&
,这表现得像&>
在bash
(即将错误和正常输出重定向到文件)。
在 *nix 类系统中,包括 Ubuntu,你经常会听到一切都是文件,或者更确切地说是文件描述符。标准输出是常量文件描述符 1,标准错误是文件描述符 2。因此,> FILE 2>&1
从技术上讲,这意味着将文件描述符 2 复制到文件描述符 1 上。换句话说这个答案:
2>&1 告诉 shell 为命令提供一个文件描述符 2,它是描述符 1 的重复。(即 stderr 和 stdout 指向同一个 fd)。
这里的关键是要注意描述符 1 必须首先设置。因为 shell 按照从左到右的顺序处理重定向,所以 告诉command >FILE 2>&1
shell 重新连接 stdout 以首先command
进入FILE
,然后描述符 2 才能成为 1 的副本,即 1 和 2 指向同一位置 - FILE
。
这当然超出了标准错误和标准输出的范围。如这个答案, 通过做3&>2
...你将文件描述符 2 复制(dup2)到文件描述符 3 上,如果文件描述符 3 已经打开,则可能会关闭它
操作文件描述符的示例包括:将命令的输出捕获dialog
到变量中
还值得注意的是,&>
特定于bash
。在zsh
其行为相同,但根据文档,“...在多操作系统存在的情况下,其效果与‘> word 2>&1’不同”。在 POSIX 兼容中/bin/sh
,这将被视为常规重定向,并将命令置于后台。另请参阅,是否存在语法上无效的 bash 代码的 sh 代码?。
也可以看看: