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

Linux 将输出重定向到变量指定的文件,linux,bash,shell,output,Linux,Bash,Shell,Output,为了保持简单,在我的bash脚本的顶部是以下代码 #/bin/bash #如果没有通过任何参数 如果[-z“$1”];然后 DEBUG='1>/dev/null' 其他的 调试class='1>&1' fi 然后在脚本的其余部分都有这样的调用 echo在这里做点什么$调试 关键是,如果有人在没有参数的情况下调用脚本(/myScript.sh),它不会回显任何内容。 但是如果他们确实传入了一个参数(/myScript.sh whathaveyou),那么echo语句应该可以正常工作 不幸的是,

为了保持简单,在我的bash脚本的顶部是以下代码

#/bin/bash
#如果没有通过任何参数
如果[-z“$1”];然后
DEBUG='1>/dev/null'
其他的
调试class='1>&1'
fi
然后在脚本的其余部分都有这样的调用

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

不幸的是,
echo在这里做了一些事情$调试
的评估结果为

echo在这里做点什么!"1>&1"
而不是

echo在这里做点什么!1>&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
,它有许多安全问题,而且不方便。

为什么不直接执行:

#!/bin/bash

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

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

我倾向于这样做:

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

可能是因为如果要用作调试的命令是选择性的,那么这也会使脚本中的所有其他命令静音:
if test-z"$1; 然后执行3>/dev/null;else exec 3>&1;fi。。。调试cmd>&3
@Hashbrown,嗯?这不会重新评估任何东西。这只需要简化代码的顶部,但您刚刚选择了一个解决方案,该解决方案要求您修改整个脚本,并添加了相当多的语法噪音。也许你对错误的解决方案发表了评论?对不起,是的,我误解了。回应你的回答;我这样做的原因是为了确保其他回音线能够正常写入。在无参数调用下,只有那些用$DEBUG表示的才会有争议,所以这是不可能的?(好吧,不用
eval
)感谢您提供了一个同样简单的选择!不是像描述的那样,没有。但是有很多选择,比如这一个,或者将所有调试信息写入FD42并有条件地重定向。是的,我只是想问一下,万一有人因为标题而来这里,这种变通方法对他们没有用。一、 我自己,将使用您的第一个示例,明确地说,您可以随时编辑您的问题,例如“向脚本添加详细/调试模式”:p其他人-大喜欢您的解决方案。为什么不使用eval?这是解决许多类似外壳问题的灵丹妙药