【问题标题】:Bash ambiguous multiple redirectBash 不明确的多重重定向
【发布时间】:2013-03-06 01:31:06
【问题描述】:

对于我的操作系统类,我们必须实现一个类似于 shell 的程序。我遇到了一个我不知道如何解释的例子:

echo "test" > out1 > out2

运行后,out1 和 out2 被创建,但 out1 为空,out2 包含“test”。

在我启动 echo 进程并将要打印的 stdout 修改为 out1 之后,接下来要做什么?

【问题讨论】:

    标签: bash process posix io-redirection


    【解决方案1】:

    重定向是从左到右处理的:首先> out1(创建out1并将文件描述符#1连接到它),然后> out2(创建out2并连接文件-描述符#1,取代前一个)。所以它实际上只是做了两次完全相同的事情(close(1) 加上fd = open(...) 加上dup(fd)),只是针对两个不同的文件。

    编辑添加:作为 Bash 参考手册puts it

    重定向按照它们出现的顺序进行处理,从左到右。

    作为 POSIX puts it:

    如果一个命令指定了多个重定向操作符,则计算顺序是从开始到结束。

    当然,这些解释仅适用于重定向确实在同一个简单命令中的情况。像这样的:

    { echo test > out1 ; } > out2
    

    实际上会将test 写入out1 并将out2 留空,因为{} 的重定向发生在echo test > out1 运行之前。

    【讨论】:

    • 如果这只是 bash 的解释,还是 POSIX 定义的解决方案,会很有趣。
    • @Rubens:它是由 POSIX 定义的;参见pubs.opengroup.org/onlinepubs/009695399/utilities/…,搜索短语“如果一个命令指定了多个重定向运算符,则计算顺序为从开始到结束。”
    • @ruakh 非常好的答案;你有我的 +1 在那里!
    • 不相关但有趣的是,zsh 有一个选项 (MULTIOS) 允许您组合重定向,因此在此示例中,out1out2 都将包含 "测试”。在这方面,它类似于管道echo test | tee out1 out2 > /dev/null
    猜你喜欢
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    相关资源
    最近更新 更多