我试图理解 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 Output
、3.6.4 Redirecting Standard Output and Standard Error
和检查命令的行为3.6.8 Duplicating File Desciptors
3.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
输出说明:
ls -R 2>&1 > a
- 文件 a 包含自身且不包含错误消息 - 为什么?ls -R 2>&1- > a
- 上述情况没有任何变化 - 那么移动 FD 的重点是什么ls -R 1>&2 > a
- 仍然没有任何改变ls -R 1>&2- > a
- 没有显示错误消息,并且错误消息在文件中仍然不可见ls -R > a 2>&1
- 两个流都重定向到文件 - 按预期工作ls -R > a 1>&2
- 文件 a 为空,因为 stdout 被重定向到 stdout
5
我理解和中的输出6
,但是为什么在命令1
,中2
,3
输出是相同的 - 以及为什么 number4
不显示错误消息,也不将此消息保存在文件中 - 这是一个谜。
所以我的问题是:
[n]>word
重定向输出和复制 fd有什么区别[n]>&digit
,我使用哪一个2>&1
- 为什么万一
1
输出2
文件不包含错误消息 - stderr 流已被重定向到 stdout - 移动 FD 的用例是什么?
- 错误信息来自哪里
4
?它不在输出文件中,也不在控制台中。
我目前的理解是:
ls -R > a 2>&1
- 首先 Bash 创建文件,a
然后运行一个命令ls -R
,该命令查找新创建的文件a
并显示stderr
重定向到stdout
并保存到文件的消息 - 但这种情况下的语法非常不明确
答案1
问题在于时间安排 - 命令行上的位置很重要,因为重定向是在遇到重定向时按顺序应用的。因此,对于第 1-4 点,之后是否出现并不重要> a
- 仅当最终达到时才会应用。所做的一切&2
都发生在 之前> a
,因此重定向到&1
该点仍将引用之前的内容,即您的终端输出