【问题标题】:How do I redirect a copy of all output of a shell script?如何重定向 shell 脚本的所有输出的副本?
【发布时间】:2014-09-01 14:27:49
【问题描述】:

我想重定向一个 shell 脚本的所有输出的副本,脚本中有一些 mount 命令和一些 echo。

如果我使用>> 2>&1,我看不到命令​​行的输出。
如果我使用| tee -a the_log_file 2>&1,我可以在命令行中获取所有输出,但在_log_file 中,没有诸如mount.nfs: /mnt/folder is busy or already mounted 之类的挂载错误输出,我也希望在the_log_file 中进行此操作

我该如何解决这个问题?

【问题讨论】:

    标签: shell pipe stderr


    【解决方案1】:

    您需要使用
    command 2>&1 | tee -a the_log_file
    而不是
    command | tee -a the_log_file 2>&1

    (如果你问我,你不需要将2>&1 放在管道盒中一个不直观的地方!;)

    有关详细信息,请查看 Bash Hackers Wiki 中的Illustrated Redirection Tutorial复制文件描述符 2>&1 部分中的插图展示了我们的案例:

      ls /tmp/ doesnotexist 2>&1     |                   less
    
     ---       +--------------+              ---       +--------------+
    ( 0 ) ---->| /dev/pts/5   |     ------> ( 0 ) ---->|from the pipe |
     ---       +--------------+    /   --->  ---       +--------------+
                                  /   /
     ---       +--------------+  /   /       ---       +--------------+
    ( 1 ) ---->| to the pipe  | /   /       ( 1 ) ---->|  /dev/pts    |
     ---       +--------------+    /         ---       +--------------+
                                  /
     ---       +--------------+  /           ---       +--------------+
    ( 2 ) ---->|  to the pipe | /           ( 2 ) ---->| /dev/pts/    |
     ---       +--------------+              ---       +--------------+
    

    【讨论】:

    • 如果你想要command的错误输出,你必须重定向它的错误输出,而不是tee的错误输出。同样,您重定向(使用管道|command 的标准输出,而不是tee 的标准输出。当你指定你想要的东西时,你为什么在你做的地方做重定向就变得很明显了。
    • 成功了,非常感谢。画面太棒了。我是shell脚本的新手,经常遇到不同类型的问题,比如-eq应该是`==or=`,怎么写while a and b, int var increase什么的,我发现不同的 shell 可能有不同的解决方案,所以你能推荐一本书来阅读并在使用 shell 脚本时完全依赖吗?
    • @JonathanLeffler 谢谢你的建议,真的很有帮助。
    • @Blangero 哦,这不是因为您是 shell 脚本的新手——而是因为 shell 语法难以理解,部分原因是它在很多方面都不一致。但您可以肯定,几乎每个 shell 的缺陷都是基于技术原因,通常与兼容性有关。
    • @Blangero 但是您关于学习 shell 的问题在某种程度上非常有趣 - 如果您找到适合网站范围的方法,也许可以发布它?答案将最好地解释你应该停止期待什么,以及期待什么——给出一个高层次的定位……例如,它可以解释为什么期望一本书的存在“完全依赖”是没有意义的.
    猜你喜欢
    • 1970-01-01
    • 2010-09-23
    • 2016-10-29
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多