我遇到了不同位置的重定向符号(>,<)。例如:
echo>&2 message
message
echo message >&2
message
>&2 echo message
message对于所有形式,我都得到了相同的结果。我使用重定向到文件(>filename)而不是重定向到流(>&2)。我还使用了输入重定向(<filename)。结果在bash和windows cmd中是相同的。
重定向位置有什么不同吗?
附注:我在书中只看到了“回声消息>&2”形式。
发布于 2015-06-10 01:31:27
shell中的X>&Y流重定向仅使用dup2(2)系统调用将一个与流(stdin、stdout、stderr等)关联的文件描述符替换为另一个文件描述符。
基本上,2>&1是字面上的dup2(2, 1),意思是“将fd2附加到当前附加的fd1,可能首先关闭fd2”。
这有两个基本属性:
foo >/dev/空2>&1
是可以的,因为它基本上
// 1) do >/dev/null close(1);fd = open("/dev/null",O_WRONLY,0666);//成功时fd为== 1。// 2) do 2>&1 dup2(2,1);
使FD2和FD1打开到同一个文件"/dev/null",而
foo 2>&1 >/dev/null
将首先将fd 2附加到fd 1所附加的相同文件,然后立即将fd 1重新附加到新文件/dev/null -使fd 2仍然对在第一次重定向时附加了fd 1的任何文件开放:
// 1) do 2>&1 dup2(2,1);// 2) do >/dev/null close(1);// FD 2仍然打开FD 1刚刚关闭之前的相同文件。fd = open("/dev/null",O_WRONLY,0666);//成功时fd将为== 1 //现在两个fd打开到不同的文件。
发布于 2015-06-10 01:55:58
对于简单的命令
echo >&2 message是唯一不同的,它唯一的不同之处在于它与POSIX sh规范不兼容;对任何位置的重定向的支持都是一个bash扩展。
>&2 echo message和echo message >&2完全相同,POSIX sh标准保证了对两者的支持。
对于复合命令
重定向仅在复合命令的末尾有效。也就是说:
while read -r line; do printf '%s\n' "$line"; done <file...is有效,但
<file while read -r line; do printf '%s\n' "$line"; done...is不保证受POSIX支持。
复合命令中的位置将应用于各个子命令,因此允许在命令中的任何位置进行重定向的bash扩展在这里没有意义。
形式语法
以下内容引用自POSIX shell语法规范:
cmd_prefix : io_redirect
| cmd_prefix io_redirect
| ASSIGNMENT_WORD
| cmd_prefix ASSIGNMENT_WORD
;
cmd_suffix : io_redirect
| cmd_suffix io_redirect
| WORD
| cmd_suffix WORD
;
simple_command : cmd_prefix cmd_word cmd_suffix
| cmd_prefix cmd_word
| cmd_prefix
| cmd_name cmd_suffix
| cmd_name
;
command : simple_command
| compound_command
| compound_command redirect_list
| function_definition
redirect_list : io_redirect
| redirect_list io_redirect
;因此,在实现没有扩展名的POSIX sh的shell中:
在cmd_prefix或cmd_suffix内允许
发布于 2015-01-13 18:07:59
看一下bash guide,特别是文件描述符部分。这些命令将标准输入重定向到标准错误。如果你按2>/dev/null过滤,你应该会看到消息已经消失了。希望这能有所帮助。
https://stackoverflow.com/questions/27918149
复制相似问题