不明确的 bash 流重定向

不明确的 bash 流重定向

我试图理解 Bash 重定向(3.6.重定向)。我准备了测试环境,并试图了解重定向的操作顺序和创建的文件描述符的顺序。

测试环境准备:

cd `mktemp -d`
mkdir no_access_dir
chmod 000 no_access_dir

ls -R输出如下:

.:
no_access_dir
ls: cannot open directory './no_access_dir': Permission denied

前 2 个 stdout 行,后跟 1 个 stderr 输出。

我使用3.6.2 Redirecting Output3.6.4 Redirecting Standard Output and Standard Error和检查命令的行为3.6.8 Duplicating File Desciptors3.6.9 Moving File Desciptors

以下是测试命令:

ls -R 2>&1 > a    # 1. 3.6.2 or 3.6.8
ls -R 2>&1- > a   # 2. 3.6.9
ls -R 1>&2 > a    # 3. 3.6.2 or 3.6.8
ls -R 1>&2- > a   # 4. 3.6.9
ls -R > a 2>&1    # 5. 3.6.4
ls -R > a 1>&2    # 6. 3.6.4

输出说明:

  1. ls -R 2>&1 > a- 文件 a 包含自身且不包含错误消息 - 为什么?
  2. ls -R 2>&1- > a- 上述情况没有任何变化 - 那么移动 FD 的重点是什么
  3. ls -R 1>&2 > a- 仍然没有任何改变
  4. ls -R 1>&2- > a- 没有显示错误消息,并且错误消息在文件中仍然不可见
  5. ls -R > a 2>&1- 两个流都重定向到文件 - 按预期工作
  6. ls -R > a 1>&2- 文件 a 为空,因为 stdout 被重定向到 stdout

5我理解和中的输出6,但是为什么在命令1,中23输出是相同的 - 以及为什么 number4不显示错误消息,也不将此消息保存在文件中 - 这是一个谜。

所以我的问题是:

  1. [n]>word重定向输出和复制 fd有什么区别[n]>&digit,我使用哪一个2>&1
  2. 为什么万一1输出2文件不包含错误消息 - stderr 流已被重定向到 stdout
  3. 移动 FD 的用例是什么?
  4. 错误信息来自哪里4?它不在输出文件中,也不在控制台中。

我目前的理解是: ls -R > a 2>&1- 首先 Bash 创建文件,a然后运行一个命令ls -R,该命令查找新创建的文件a并显示stderr重定向到stdout并保存到文件的消息 - 但这种情况下的语法非常不明确

答案1

问题在于时间安排 - 命令行上的位置很重要,因为重定向是在遇到重定向时按顺序应用的。因此,对于第 1-4 点,之后是否出现并不重要> a- 仅当最终达到时才会应用。所做的一切&2都发生在 之前> a,因此重定向到&1该点仍将引用之前的内容,即您的终端输出

相关内容