&2 message"、 "echo message >&2"和 ">&2 echo message"中重定向位置的区别-6ren"> &2 message"、 "echo message >&2"和 ">&2 echo message"中重定向位置的区别-我遇到了重定向符号的不同位置( > , &2 message message echo message >&2 message >&2 echo message message 对于所有表单,我得到了-6ren">
gpt4 book ai didi

bash - "echo>&2 message"、 "echo message >&2"和 ">&2 echo message"中重定向位置的区别

转载 作者:行者123 更新时间:2023-11-29 09:30:09 37 4
gpt4 key购买 nike

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

echo>&2 message
message

echo message >&2
message

>&2 echo message
message

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

重定向位置有区别吗?

附言我在书上只看到“echo message >&2”的形式。

最佳答案

shell 中的X>&Y 流重定向仅使用dup2(2) replace 一个文件描述符的系统调用,与流相关联(stdinstdoutstderr 或其他),与另一个。

基本上,2>&1 字面意思是 dup2(2, 1),意思是“将 FD 2 附加到当前附加的任何 FD 1,可能首先关闭 FD 2”。

这有两个基本属性:

  • 为了使其工作,用于替换现有文件描述符的文件描述符必须已经代表我们希望我们的描述符附加到的文件/设备。

  • 一旦我们将一个文件描述符替换为另一个文件描述符,然后重新打开用作其他文件/设备的替换的文件描述符,两个文件描述符就会断开连接。因此顺序很重要:

    foo >/dev/null 2>&1

    没关系,因为它基本上是

    // 1) do >/dev/null
    close(1);
    fd = open("/dev/null", O_WRONLY, 0666); // fd will be == 1 on success.
    // 2) do 2>&1
    dup2(2, 1);

    使 FD 2 和 1 打开同一个文件“/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 is still open to the same file FD 1 was just before closing.
    fd = open("/dev/null", O_WRONLY, 0666); // fd will be == 1 on success
    // Now both FDs are opened to different files.

关于bash - "echo>&2 message"、 "echo message >&2"和 ">&2 echo message"中重定向位置的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27918149/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com