将输出重定向到变量指定的文件

时间:2013-10-08 23:25:34

标签: linux bash shell output

为了简单起见,我的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

我该如何做到这一点?

3 个答案:

答案 0 :(得分:2)

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

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,它有许多安全问题并且不方便。

答案 1 :(得分:0)

为什么不这样做:

#!/bin/bash

test -z "$1" && exec > dev/null

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

答案 2 :(得分:0)

我倾向于这样做:

#!/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参数还允许您在脚本中的不同位置轻松打开和关闭输出。