我试图了解输出重定向,但是我很挣扎。我认为我没有真正的区别。
1 > file # - redirect stdout to file (override mode)
1 >> file # - redirect stdout to file (append mode)
2 > 1 # 1) would that also redirect stderr to stdout, replacing stdout?
2 >> 1 # 2) would this redirect stderr to stdout (appending to it,
# i.e. haivng both sent to stdout?)
1>&9 # - duplicates stdout to file descriptor (pointer) 9
# 3) what's the difference of 2>&1 to a 2 >> 1? Does >> only run at the end
# of output?
echo foo > file # - redirects output to file (override mode)
>file 2>&1 # - duplicates stderr to stdout, then redirects to file in override mode
# 4) why is this giving me stdout, too, when the syntax is 2>&1,
# i.e. duplicate stderr into stdout - not merge 2 into 1?
我假设“&”号&
表示重复,而不是重定向。但是,什么是重定向的差异a
来b
(将a
保持不变?)来复制a
到b
(会a
和b
一样吗?)?2>&1
有效地似乎重定向并合并2
到1
,即本来应该进入的2
内容1
,但仅在1
...为什么?
我很混乱...
首先,文件名之后 >
或之后的>>
是文件名;因此> 1
写入名为的文件1
。
示例中给出的其他格式的数字是文件描述符。默认情况下,程序以连接的文件描述符0(标准输入),1(标准输出)和2(标准错误)开头;当您从交互式外壳启动程序时,它们将连接到终端的输入和输出(您可以通过ls -l /proc/$$/fd
在Linux上运行来查看它们)。
在之前指定一个数字>
,>>
或>&
指定您要操作的文件描述符;该数字必须在>
符号前面。因此
echo Example 2> stderr
将打印“示例”并创建一个空stderr
文件(其中将包含发送到标准错误的所有内容)。
您可以将文件描述符视为表中指向文件的条目。因此默认情况下:
/dev/tty
/dev/tty
/dev/tty
指定1> file
(或简单地> file
)将文件描述符1更新为指向file
,以截断模式打开(因此其内容将被替换)。指定2> 1
更新文件描述符2以指向1
在截断模式下打开的名为的文件。
使用>&
(或&>
,这是首选形式)复制文件描述符只是将一个文件描述符更新为指向另一个文件描述符所指向的内容。在您的最后一个示例中,> file
更新文件描述符1:
/dev/tty
file
/dev/tty
然后2>&1
更新文件描述符2:
/dev/tty
file
file
(顺序很重要:> file 2>&1
产生以上内容,2>&1 > file
只会最终重定向文件描述符1)。
该1>&9
格式仅在文件描述符9已打开的情况下有效,例如,通过将文件描述符1复制到文件描述符1(9>&1
)或通过打开文件(9> file
)。这种类型的构造对于重定向时跟踪文件描述符的原始内容很有用。因此,在脚本中,您可以安全地复制1和2,将标准输出和错误重定向到您需要的任何目的,然后将其还原...
该猛砸手册有所有的细节。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句