Linux 将输出重定向到变量指定的文件
为了保持简单,在我的bash脚本的顶部是以下代码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语句应该可以正常工作 不幸的是,
#/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?这是解决许多类似外壳问题的灵丹妙药