ego*_*or7 17 bash shell stdout stderr io-redirection
我正在玩i/o shell重定向.我试过的命令(在bash中):
ls -al *.xyz 2>&1 1> files.lst
Run Code Online (Sandbox Code Playgroud)
和
ls -al *.xyz 1> files.lst 2>&1
Run Code Online (Sandbox Code Playgroud)
*.xyz当前文件夹中没有任何文件.
这些命令给了我不同的结果.第一个命令ls: *.xyz: No such file or directory在屏幕上显示错误消息.但第二个将此错误消息打印到该文件.为什么第一个命令无法将错误的输出写入文件?
leg*_*s2k 32
该猛砸手册有一个明显的例子(类似于你),以显示该订单事宜,也解释了区别.这是摘录的相关部分(强调我的):
请注意,重定向的顺序非常重要.例如,命令
ls> dirlist 2>&1
指示标准输出(文件描述符1)和标准误差(文件描述符2)到文件dirlist,而命令
ls 2>&1> dirlist
仅将标准输出指向文件dirlist,因为在将标准输出重定向到dirlist之前,标准错误是标准输出的副本.
这篇文章从POSIX的角度解释了它.
由于关键差异而发生混淆.>重定向不是通过使左操作数(stderr)指向右操作数(stdout),而是通过制作右操作数的副本并将其分配给左侧.从概念上讲,通过复制而不是通过引用进行分配.
因此,从左到右阅读这是Bash解释的方式:ls > dirlist 2>&1意味着重定向stdout到文件dirlist,然后重定向stderr到stdout当前的任何内容(已经是文件dirlist).但是,ls 2>&1 > dirlist会重定向stderr到stdout当前的任何内容(即屏幕/终端),然后重定向stdout到dirlist.
mkl*_*nt0 17
重定向是:
1stdout(默认值)和2stderr),则稍后针对该流的重定向将引用已经重定向的版本.1在早期重定向中指定文件描述符作为目标,那么即使稍后重定向,也会锁定当时的1含义.1应用于问题的例子:
>file 2>&1:
>file 首先将stdout(文件描述符1,由不带前缀>的文件描述符编号隐含)重定向到输出文件file2>&1 然后将stderr(2)重定向到已经重定向的 stdout(1).file.2>&1 >file:
2>&1首先将stderr重定向到当时原始的标准输出; 由于文件描述符不2参与进一步的重定向,因此stderr输出将转到该点定义的任何stdout - 即原始 stdout,因为这是第一次重定向.
>file然后将原始标准输出重定向到file- 但这对已经锁定的stderr重定向没有任何影响.file,而发送到stderr输出则输出到(原始的,未重定向的)stdout.anu*_*ava 12
这个错误:
ls: *.xyz: No such file or directory
Run Code Online (Sandbox Code Playgroud)
是stderr由ls二进制写的.
但是在这个命令中:
ls -al *.xyz 2>&1 1> files.lst
Run Code Online (Sandbox Code Playgroud)
您首先重定向 stderr到stdout默认情况下tty(终端)
然后你要重定向stdout到一个文件files.lst,但是请记住,stderr并不重定向到文件,因为你必须stderr要stdoutredirection(重定向)之前 stdout到file重定向.在这种情况下你stderr仍然会被写入tty.
然而,在第二情况下,你改变重定向(第一的顺序stdout来file,然后stderr到stdout),并且正确地重定向stderr到一个file其也正在使用stdout.
| 归档时间: |
|
| 查看次数: |
4122 次 |
| 最近记录: |