Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
I';我正在学习bash,对重定向操作符的工作原理(评估顺序)感到困惑_Bash - Fatal编程技术网

I';我正在学习bash,对重定向操作符的工作原理(评估顺序)感到困惑

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(因为这应该已经从左到右完成了命令执行) 在上面的命令中,表达式

我正在阅读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'

不,不需要管道。整个操作在同一进程中执行。这里所做的是命令
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)没有任何内容被“替换”,这些是文件描述符,默认情况下它们会转到某个地方,我们可以将它们重定向到其他地方。默认情况下,他们都去终端,终端上没有任何东西被“替换”。在这些上下文中,“成为副本”或“被复制”是什么意思?我在回答中强调了这一点。我有一个与变量赋值“按值”或“按引用”进行比较的示例,以显示求值顺序。当然要注意,这些都是变量,而不是变量。