AJJ*_*AJJ 10 command-line bash output input redirect
所以我正在努力学习如何将标准输出和标准错误传递到各个领域。
假设我有一个here.txt单独的文件夹。
所以如果我这样做
ls here.txt not-here.txt 1>out 2>&1
Run Code Online (Sandbox Code Playgroud)
由于here.txt存在,我将有一些输出指向文件,out但由于not-here.txt不存在,错误将通过标准错误发送,我将其重定向到标准输出2>&1。
但是,为什么这不起作用:
ls here.txt not-here.txt 2>&1 1>out
Run Code Online (Sandbox Code Playgroud)
如果我在标准输出指令之后进行重定向,它似乎才有效?为什么?
重定向的顺序很重要。例如,命令
ls > dirlist 2>&1
Run Code Online (Sandbox Code Playgroud)
将标准输出和标准错误都指向文件 dirlist,而命令
ls 2>&1 > dirlist
Run Code Online (Sandbox Code Playgroud)
仅将标准输出定向到文件 dirlist,因为在将标准输出重定向到 dirlist 之前,标准错误已从标准输出(通常仍指向终端窗口)复制。
起初这可能会觉得有违直觉,但仔细想想,我们就可以理解了。
你可以在man bash关于重定向的章节中找到这个解释,
重定向
在执行命令之前,可以使用由 shell 解释的特殊符号重定向其输入和输出。重定向允许命令文件句柄被复制、打开、关闭、引用不同的文件,并且可以更改命令读取和写入的文件。重定向还可以用于修改当前 shell 执行环境中的文件句柄。以下重定向操作符可能出现在简单命令的任何位置之前或出现,也可能出现在命令之后。重定向按照它们出现的顺序进行处理,从左到右。
前面可能有一个文件描述符编号的每个重定向可以改为在前面加上一个形式的单词
{varname}。在这种情况下,对于除>&-and之外的每个重定向运算符<&-,shell 将分配一个大于或等于 10 的文件描述符并将其分配给varname。如果>&-或<&-前面有{varname},则 的值varname定义要关闭的文件描述符。在下面的描述中,如果省略了文件描述符编号,并且重定向运算符的第一个字符是
<,则重定向是指标准输入(文件描述符 0)。如果重定向运算符的第一个字符是>,则重定向引用标准输出(文件描述符 1)。除非另有说明,否则以下描述中重定向运算符后面的单词会受到大括号扩展、波浪号扩展、参数和变量扩展、命令替换、算术扩展、引号删除、路径名扩展和单词拆分。如果扩展到多个单词,bash 会报告错误。
请注意,重定向的顺序很重要。例如,命令
Run Code Online (Sandbox Code Playgroud)ls > dirlist 2>&1将标准输出和标准错误都指向文件
dirlist,而命令Run Code Online (Sandbox Code Playgroud)ls 2>&1 > dirlist仅将标准输出定向到文件
dirlist,因为在标准输出被重定向到dirlist.
编辑:以下命令行可能会解释会发生什么
准备
sudodus@xenial32:~$ touch qwerty;rm asdf
rm: cannot remove 'asdf': No such file or directory
Run Code Online (Sandbox Code Playgroud)
为一个现有文件和一个不存在的文件运行 list 命令
sudodus@xenial32:~$ ls qwerty asdf
ls: cannot access 'asdf': No such file or directory
qwerty
Run Code Online (Sandbox Code Playgroud)
在重定向标准输出之前重定向错误输出。只有标准输出被重定向到输出文件。
sudodus@xenial32:~$ ls qwerty asdf 2>&1 > output-file ;echo '---';cat output-file
ls: cannot access 'asdf': No such file or directory
---
qwerty
Run Code Online (Sandbox Code Playgroud)
重定向标准输出后重定向错误输出。错误输出和标准输出都被重定向到输出文件。
sudodus@xenial32:~$ ls qwerty asdf > output-file 2>&1 ;echo '---';cat output-file
---
ls: cannot access 'asdf': No such file or directory
qwerty
Run Code Online (Sandbox Code Playgroud)
令牌&>可用于重定向标准错误和标准输出。它可以在 中使用bash,但在其他 shell 中可能不可用。
sudodus@xenial32:~$ ls qwerty asdf &> output-file ;echo '---';cat output-file
---
ls: cannot access 'asdf': No such file or directory
qwerty
sudodus@xenial32:~$
Run Code Online (Sandbox Code Playgroud)