【问题标题】:Redirect output to file specified by variable将输出重定向到由变量指定的文件
【发布时间】:2013-10-08 23:25:33
【问题描述】:

为简单起见,我的 bash 脚本顶部是以下代码

#!/bin/bash
#if no arguments passed
if [ -z "$1" ]; then
    DEBUG='1>/dev/null'
else
    DEBUG='1>&1'
fi

然后整个脚本的其余部分都是这样的调用

echo Doing something here! $DEBUG

关键是如果有人在没有参数的情况下调用脚本 (./myScript.sh),它不会回显任何内容。
但如果他们确实传入了一个参数 (./myScript.sh whathaveyou),echo 语句应该可以正常工作。

不幸的是,echo Doing something here! $DEBUG 被评估为

echo Doing something here! "1>&1"

而不是

echo Doing something here! 1>&1

我怎样才能做到这一点?

【问题讨论】:

    标签: linux bash shell output


    【解决方案1】:

    您可以创建一个条件函数,而不是尝试让您的命令将文本数据评估为命令语法:

    if [ -z "$1" ]; then
      report() {
        true
      }
    else
      report() {
        echo "$@"
      }
    fi
    report "Doing something here!"
    

    如果你想运行通用命令而不仅仅是打印东西,你可以类似地使用

    if [ -z "$1" ]; then
      report() {
        "$@" > /dev/null
      }
    else
      report() {
        "$@"
      }
    fi
    
    report echo "Here are you files:"
    report ls
    

    要完全按照您指定的方式实施,您必须使用eval,它存在许多安全问题并且不方便。

    【讨论】:

    • 所以不可能? (好吧,不使用eval)感谢您提供同样简单的替代方案!
    • 不像描述的那样,没有。但是有很多替代方案,例如这个或将所有调试信息写入 fd 42 并有条件地重定向。
    • 是的,我只是问是否有人因为标题而来到这里,而这种解决方法对他们没有用。我本人肯定会使用您的第一个示例
    • 您可以随时编辑您的问题,例如“向脚本添加详细/调试模式”:P
    • 那个人 - 非常喜欢你的解决方案。 Hashbrown - 为什么不使用 eval?它是许多类似外壳问题的灵丹妙药
    【解决方案2】:

    为什么不直接做:

    #!/bin/bash
    
    test -z "$1" && exec > dev/null
    

    如果第一个参数为空或未传递,这会将脚本的输出重定向到位桶。然后所有命令(除非重定向)都将丢弃它们的输出。

    【讨论】:

    • 也许因为这也会使脚本中的所有其他命令静音
    • 如果要用作调试的命令是选择性的:if test -z "$1; then exec 3> /dev/null; else exec 3>&1; fi; ... debug-cmd >&3
    • @Hashbrown,嗯?这不会重新评估任何东西。这只需要您简化代码的顶部,但是您刚刚选择了一个解决方案,需要您修改整个脚本并添加相当多的语法噪音。也许您评论了错误的解决方案?
    • 对不起,是的,我误解了。回应您的回答;我这样做的原因是为了确保其他回声线可以正常写入。只有用 $DEBUG 表示的那些在无参数调用下才会没有实际意义
    【解决方案3】:

    我倾向于这样做:

    #!/bin/bash
    
    # if $1 is not empty, set $enable_trace to 'true'
    enable_trace=${1:+true}
    
    function trace()
    {
      if [ "$enable_trace" = 'true' ]; then
        echo "$@"
      fi
    }
    
    trace Doing something here
    

    引入 $enable_trace 参数还允许您在脚本中的不同点轻松打开和关闭输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-31
      • 2012-07-02
      • 2016-08-09
      • 2013-10-11
      • 2023-03-19
      相关资源
      最近更新 更多