加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 如何将重定向符号分配给变量以组装命令行

发布时间:2020-12-15 21:08:36 所属栏目:安全 来源:网络整理
导读:我有几个BASH脚本,它们使用命令和参数的变量来启动常用于常见参数的程序.调用最后出现如下: $PROGRAM $ARG1 $ARG2 现在我想将输出重定向到stderr,默认情况下将stdout重定向到/ dev / null.我希望能够通过切换到脚本来禁用它(-v = verbose).但是,如果我尝试
我有几个BASH脚本,它们使用命令和参数的变量来启动常用于常见参数的程序.调用最后出现如下:

$PROGRAM $ARG1 $ARG2 &

现在我想将输出重定向到stderr,默认情况下将stdout重定向到/ dev / null.我希望能够通过切换到脚本来禁用它(-v = verbose).但是,如果我尝试将“2>& 1> / dev / null”分配给var,例如REDIRECTION,(如果指定了详细信息则清除它)并尝试调用如下:

$PROGRAM $ARG1 $ARG2 $REDIRECTION &

重定向指令作为参数传递给程序.有没有办法做到这一点?或者我是否必须使用我的解决方案,即有两个单独的调用行,一个有一个没有重定向指令,一个取决于“详细程度”?

解决方法

一种选择是使用eval builtin,它像Bash命令一样处理其参数,处理重定向运算符之类的事情.然而,eval是相当危险的,因为它将重新处理它的所有参数,甚至是那些已经被正确处理的参数,如果不完美的话,这可能会导致奇怪或不安全的行为.

由于命令的两个版本之间唯一有问题的区别是重定向的存在与否,更好的选择是使用exec内置.这个命令:

exec >/dev/null 2>&1

将shell脚本的其余部分的STDOUT和STDERR重定向到/ dev / null.这个命令:

[[ "$IS_VERBOSE" ]] || exec >/dev/null 2>&1

将运行exec> / dev / null 2>& 1,除非$IS_VERBOSE为非空白,在这种情况下它什么也不做. (您可以将[[“$IS_VERBOSE”]]替换为您已用于检测详细程度的任何类型的条件表达式.)

所以,你想要的是这样的:

(
    [[ "$IS_VERBOSE" ]] || exec >/dev/null 2>&1
    "$PROGRAM" "$ARG1" "$ARG2" &
)

括号(…)将设置子shell,因此exec命令(如果运行)仅影响直到).

(顺便说一句,请注意我将2>& 1> / dev / null更改为> / dev / null 2>& 1:顺序很重要.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读