【问题标题】:Order of events in Bash shell redirection of standard output and error to the same fileBash shell 将标准输出和错误重定向到同一文件中的事件顺序
【发布时间】:2020-09-29 22:06:43
【问题描述】:

我想问一个关于使用 Bash Shell 将标准输出和错误重定向到同一个文件的问题。

我是 Linux 命令提示符的初学者,并且正在阅读 William E. Shotts 的一本名为“Linux 命令行”的书。年少者

在关于重定向的部分中,他指出要将标准输出和错误重定向到同一个文件,编写以下命令:

ls -l /bin/usr > ls-output.txt 2>&1

据我了解,/bin/usr 目录不存在,因此抛出错误并发送到标准错误文件。命令ls -l /bin/usr 的输出被重定向到文本文件ls-output.txt,标准错误被重定向到2>&1 的标准输出。

我在两个方面感到困惑:

  1. 首先,事件的顺序。根据我的直觉,由于我认为命令是以 L-R 方式(从左到右)执行的,因此 ls 命令的重定向似乎首先发生在标准错误流(@ 987654328@) 到标准输出流 (1)。

  2. ampersand 的使用。我从谷歌搜索中了解到,如果将& 放在命令的末尾,这意味着可以在执行初始命令之前输入其他命令 - 当初始命令与计时器相结合时,该命令具有应用程序。我相信这里的 & 符号意味着 & 意味着我们正在重定向到一个文件 descriptor 而不是一个名为 1 的文件名,尽管我不确定这是否正确。

总的来说,我有两个问题:

  1. 上面命令的执行顺序是什么?
  2. 我的 & 符号& 的功能是否正确?如果不是,它的作用是什么?

【问题讨论】:

    标签: linux bash shell io-redirection


    【解决方案1】:

    Linux 具有三个默认数据流 - stdin (0)stdout (1)stderr (2)

    • stdin 或“标准输入”用于从用户那里读取数据。
    • stdout 或“标准输出”用于“常规”输出。
    • stderr,或“标准错误”用于错误。

    > 字符允许您将命令的输出重定向到上述流之一或文件中。

    当您运行命令ls -l /bin/usr > ls-output.txt 2>&1 时,您实际上向系统询问了两件事:

    1. 将命令的stdout重定向到文件ls-output.txt中。
    2. 将命令的stderr重定向到编号为1的数据流中,即stdout流。

    其实,单独使用>就相当于1>,意思是你重定向了所有数据流的输出。 1.

    & 字符告诉您的系统您要将输出重定向到数据流,而不是文件。省略此字符将导致您的 stderr 写入名为 1 的文件。

    需要注意的是&这个字符在Linux中的作用更多,比如在后台运行命令或者串联命令(使用&&),但是完全不同。

    最好的问候。

    【讨论】:

    • 我有一个反思——重定向发生在首先完全读取命令时,即在标准流重定向之后?那么在2>&1 之后该命令会真正执行吗?
    • 比这复杂一点。重定向实际所做的是将进程的文件描述符替换为命令指定的文件描述符。例如,如果我有一个程序不断向stdout 写入“Hello, World”,使用> 将其输出重定向到文件将导致程序写入文件而不是屏幕。该程序仍将永远运行,但其输出将写入文件。因此,对于您的问题 - 重定向不会影响二进制文件的执行顺序,它只会更改其文件描述符。请注意,管道是完全不同的东西。
    • 非常感谢!我会给你一个赞成票和一个勾号,以获得一个很好的解释!欢迎来到 StackOverflow!
    • 谢谢!如果您有更多问题,请随时提出:)
    【解决方案2】:

    让我扩展一下第一个方面,即事件的顺序。以严格的从左到右的顺序来思考事情是错误的;命令处理和执行发生在阶段中,虽然每个阶段(通常)从左到右完成,但每个阶段将(再次,通常)在下一个阶段开始之前完成。

    在这种情况下,相关阶段是:

    1. shell 解析命令行(这实际上是several phases 本身)。
    2. shell 处理 I/O 重定向(从左到右)。
    3. shell 执行命令(所有重定向都已经到位)。

    这样做的一个重要后果是您can't redirect output back to a file you're using as input for the command。例如,如果您尝试使用 sort file.txt >file.txt 对文件进行排序,shell 将打开 file.txt 并清空它以使其为新内容做好准备,然后 sort 有机会读取它。结果:一个空文件。

    一个不太重要的后果是,如果重定向中出现错误,它甚至会阻止命令启动。如果你运行nosuchcommand <nosuchfile,bash 会在注意到nosuchcommand 也不存在之前打印一个关于nosuchfile 不存在的错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-15
      • 2012-11-23
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多