首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"echo>&2报文“、”回应报文>&2“和">&2回应报文”中重定向位置的差异

"echo>&2报文“、”回应报文>&2“和">&2回应报文”中重定向位置的差异
EN

Stack Overflow用户
提问于 2015-01-13 16:54:05
回答 3查看 172关注 0票数 3

我遇到了不同位置的重定向符号(><)。例如:

代码语言:javascript
复制
echo>&2 message
message

echo message >&2
message

>&2 echo message
message

对于所有形式,我都得到了相同的结果。我使用重定向到文件(>filename)而不是重定向到流(>&2)。我还使用了输入重定向(<filename)。结果在bash和windows cmd中是相同的。

重定向位置有什么不同吗?

附注:我在书中只看到了“回声消息>&2”形式。

EN

回答 3

Stack Overflow用户

发布于 2015-06-10 01:31:27

shell中的X>&Y流重定向仅使用dup2(2)系统调用将一个与流(stdinstdoutstderr等)关联的文件描述符替换为另一个文件描述符。

基本上,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打开到不同的文件。

票数 1
EN

Stack Overflow用户

发布于 2015-06-10 01:55:58

对于简单的命令

echo >&2 message是唯一不同的,它唯一的不同之处在于它与POSIX sh规范不兼容;对任何位置的重定向的支持都是一个bash扩展。

>&2 echo messageecho message >&2完全相同,POSIX sh标准保证了对两者的支持。

对于复合命令

重定向仅在复合命令的末尾有效。也就是说:

代码语言:javascript
复制
while read -r line; do printf '%s\n' "$line"; done <file

...is有效,但

代码语言:javascript
复制
<file while read -r line; do printf '%s\n' "$line"; done

...is不保证受POSIX支持。

复合命令中的位置将应用于各个子命令,因此允许在命令中的任何位置进行重定向的bash扩展在这里没有意义。

形式语法

以下内容引用自POSIX shell语法规范:

代码语言:javascript
复制
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_prefixcmd_suffix内允许

  • 重定向,即。在简单命令的开头或结尾允许在复合命令的末尾(仅)。
票数 1
EN

Stack Overflow用户

发布于 2015-01-13 18:07:59

看一下bash guide,特别是文件描述符部分。这些命令将标准输入重定向到标准错误。如果你按2>/dev/null过滤,你应该会看到消息已经消失了。希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27918149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档