gpt4 book ai didi

linux - 为什么命令; ls -l file_doesnot_exists >/dev/null 2>&1 正在工作; ls -l 2>&1 file_doesnot_exists >/dev/null 不是

转载 作者:行者123 更新时间:2023-12-05 01:50:01 25 4
gpt4 key购买 nike

我只是想知道如何知道我们通常将哪条指令放在 shell 命令的前面?例如,为什么命令:

ls -l file_doesnot_exists >/dev/null 2>&1

正在工作,而这个命令:

ls -l 2>&1 file_doesnot_exists >/dev/null

不是

最佳答案

注意:

  • 问题被标记为 linux,这意味着 ls 不是 PowerShell 自己的 Get-ChildItem 的内置别名 cmdlet(仅适用于 Windows),而是指标准 /bin/ls Unix 实用程序。

  • PowerShell 中,您的命令之间没有区别,因为顺序redirections没关系

    • 所有目标 output streams始终保持其身份:流的任何重定向都会影响同一命令中同一流的任何其他重定向。

    • 因此,您的命令均未按预期工作并且没有输出,因为 2>&1 将错误流 (2) 重定向到成功输出流 (1),后者的输出最终被丢弃,由于 >/dev/null(>1> 相同),包括重定向的错误流输出。

  • 相比之下,在 POSIX 兼容的 shell 中,例如 Bash,重定向的顺序很重要 :

    • ls -l 2>&1 file_doesnot_exists >/dev/null WORKS 如预期:

      • 2>&1 将 stderr 输出重定向到原始 stdout。
      • stdout 的稍后 重定向(>1> 相同)对没有影响 2>&1
      • 最终效果是只有 stderr 行打印到 stdout,而 stdout 行被丢弃(通过重定向到 /dev/null)。
    • 相比之下,ls -l file_doesnot_exists >/dev/null 2>&1 DOES NOT 并且没有输出:

      • >/dev/null 将 stdout 重定向到 /dev/null,即有效地丢弃 stdout 输出。

      • 因为 2>&1 出现在命令的后面1 指的是已经重定向 stdout,因此 stderr 输出也被丢弃。

    • 参见 this answer获取更多信息。

关于linux - 为什么命令; ls -l file_doesnot_exists >/dev/null 2>&1 正在工作; ls -l 2>&1 file_doesnot_exists >/dev/null 不是,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73501948/

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