【问题标题】:Bash scripting redirection not working, why? [duplicate]Bash 脚本重定向不起作用,为什么? [复制]
【发布时间】:2014-01-04 12:07:41
【问题描述】:

我最近在 bash 脚本中发现了一个意外行为,我想在解决它之前了解它。这是一个简化的示例:

#! /bin/sh
SCRIPT="/tmp/echoscript.sh >> /tmp/log"
/bin/sh ${SCRIPT}

echoscript.sh 只是做 'echo "abc"'

出乎意料的是,'abc' 进入了终端,而不是 /tmp/log 文件。这是为什么呢?

如果我将第三行更改为:

/bin/sh ${SCRIPT} >> /tmp/log

然后我得到了预期的结果; 'abc' 进入日志文件。

【问题讨论】:

    标签: bash


    【解决方案1】:

    您不能将重定向放在这样的变量中。当你这样做时,Bash 会解释 /bin/sh ${SCRIPT},就像你写的一样:

    /bin/sh "/tmp/echoscript.sh" ">>" "/tmp/log"
    

    注意">>" 是如何被引用的,从而终止了重定向的尝试。这是因为 Bash 分阶段解析命令,并且解析重定向发生在变量扩展之前。不检查变量值的重定向。

    【讨论】:

      【解决方案2】:

      当变量被扩展时,对结果的唯一进一步处理是分词和通配符扩展(又名通配符)。不会扫描结果以查找其他特殊运算符,例如重定向。

      如果你想完全重新处理命令行,你必须使用eval

      eval "/bin/sh ${SCRIPT}"
      

      【讨论】:

        【解决方案3】:

        这不会如您所愿,因为重定向未在 ${SCRIPT} 中处理。你会得到/bin/sh: /tmp/echoscript.sh >> /tmp/log: No such file or directory

        您需要告诉 shell 在运行 ${SCRIPT} 之前对其进行评估,如下所示:

        eval /bin/sh ${SCRIPT}
        $ cat /tmp/log
        abc
        

        【讨论】:

          【解决方案4】:

          另一种方式:

          alias SCRIPT="/bin/sh /tmp/echoscript.sh >> /tmp/log"
          SCRIPT
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-05-15
            • 2012-09-29
            • 2016-09-13
            • 1970-01-01
            • 2023-03-19
            • 2021-04-20
            相关资源
            最近更新 更多