I';我正在学习bash,对重定向操作符的工作原理(评估顺序)感到困惑
我正在阅读bash参考手册,下面的命令 “ls>dirlist 2>&1”-该命令将输出和std err都指向文件dirlis(来自bash参考手册) 在上面的命令中,表达式“2>&1”的最后一部分,为什么在“2>&1”之前不需要管道或重定向操作符?i、 e.“ls>dirlist<2>&1” 2> &1-是否将标准错误重定向到标准输出,ls>dirlist平均值(将ls的输出重定向到dirlist)。2>&1如何影响ls>dirlist(因为这应该已经从左到右完成了命令执行) 在上面的命令中,表达式“2>&1”的最后一部分是 “2>&1”之前不需要管道或重定向运算符吗?i、 e.“ls> 目录列表<2>&1' 不,不需要管道。整个操作在同一进程中执行。这里所做的是命令I';我正在学习bash,对重定向操作符的工作原理(评估顺序)感到困惑,bash,Bash,我正在阅读bash参考手册,下面的命令 “ls>dirlist 2>&1”-该命令将输出和std err都指向文件dirlis(来自bash参考手册) 在上面的命令中,表达式“2>&1”的最后一部分,为什么在“2>&1”之前不需要管道或重定向操作符?i、 e.“ls>dirlist&1” 2> &1-是否将标准错误重定向到标准输出,ls>dirlist平均值(将ls的输出重定向到dirlist)。2>&1如何影响ls>dirlist(因为这应该已经从左到右完成了命令执行) 在上面的命令中,表达式
ls 1>dirlist 2>dirlist
&1表示引用发送输出的文件。同样的命令也可以执行
ls 2>dirlist 1>&2
参考2>&1的第一个搜索结果有一个很好的解释。我相信这些是介绍bash手册的要点: 在执行命令之前,可以重定向其输入和输出 因此,shell在命令执行之前处理重定向。这就是这个命令的原因
cat文件>文件
将导致一个空文件。因为在执行cat
之前,shell会将命令的标准输出重定向到该文件
,并将其初始化为空文件,因此文件的初始内容会丢失
重定向按从左到右的顺序处理
对
这是必要的,并应与此相结合:
ls 2>&1>目录列表
仅将标准输出定向到文件目录列表,因为标准
标准输出之前的标准输出副本出错
输出被重定向到目录列表
因此,重定向的评估是从左到右进行的,在这种情况下查看2
和1
是很重要的,因为语句2>&1
不应被解释为“按引用分配”,而确切地说2
将成为1
的副本,评估时的1
实例。稍后,在右侧,1
被重定向到文件,但这对2
无效
这种行为提醒了变量的赋值x=y
表示x
获取y
的值。如果以后我执行y=z
,这对x
的值没有影响
在不同的情况下:
ls > dirlist 2>&1
标准输出首先被重定向到文件。之后,标准错误(
2
)被重定向到标准输出(1
)。在最后一次重定向时,1
已重定向到一个文件,2
成为1
的副本,因此两者都写入文件。so'ls 2>&1>dirlist',在这种情况下,我们是否会丢失(而不是捕获)stderr?或者stderr和stdoutput都写入文件?也可以是“ls>dirlist 2>&1”-这里第一个stdout被重定向到dirlist。然后2成为1的副本/stderr成为stdout的副本(即2现在是“stdout”),stdout中如何显示stderr?由于默认情况下,stderr内容应替换为ls?(a)
的stdout,因此stdout和stderr将发送到终端。所以这里:ls 2>&1>dirlist
,2
变成了1
的副本,当1
要到终端时(还没有重定向到文件),所以2
转到终端(是的,您没有捕获它)<代码>(b)没有任何内容被“替换”,这些是文件描述符,默认情况下它们会转到某个地方,我们可以将它们重定向到其他地方。默认情况下,他们都去终端,终端上没有任何东西被“替换”。在这些上下文中,“成为副本”或“被复制”是什么意思?我在回答中强调了这一点。我有一个与变量赋值“按值”或“按引用”进行比较的示例,以显示求值顺序。当然要注意,这些都是变量,而不是变量。