我有一对夫妇的推出通常我使用的命令和参数变量共同参数使用程序bash脚本。 调用出现在像这样的结尾:
$PROGRAM $ARG1 $ARG2 &
现在,我要输出到stderr和stdout重定向/dev/null
默认。 我希望能够有一个开关来禁用该脚本( -v
=详细)。 但是,如果我尝试分配"2>&1 > /dev/null"
的变种,说REDIRECTION
,(结算,如果详细指定),并尝试调用像这样:
$PROGRAM $ARG1 $ARG2 $REDIRECTION &
重定向指令作为参数传递给程序。 有没有办法做到这一点? 还是我必须用我的解决方案,它是有2条独立的调用线,一条用和一个没有重定向指令,根据“冗长”?
一种选择是使用eval
内置,它处理它的参数如bash命令,搬运东西像重定向操作符。 但是, eval
是相当危险的,因为它会再处理它的所有参数,甚至已经被正确地处理的,这可能会导致奇怪的或不安全的行为,如果不做到完美 。
因为你的命令的两个版本之间的唯一问题区别是有无重定向的,更好的选择是使用exec
内置。 这条命令:
exec >/dev/null 2>&1
重定向shell脚本的其余部分的输出和错误/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
:顺序事项)
而不是试图编码shell语法为参数,只是把默认目标为参数的每个重定向操作,并允许覆盖默认的方法。
# A little bash-specific, but appropriate defaults should exist for the shell
# of your choice.
STDOUT=/dev/stdout
STDERR=/dev/stderr
if some-test; then
STDOUT=some-other-file
fi
if some-other-test; then
STDERR=different-file
fi
$PROGRAM $ARG1 $ARG2 > $STDOUT 2> $STDERR
你可以建立你喜欢的,然后用eval执行任何命令行:
line="echo hello"
if ....
line="$line > junk.out"
fi
eval $line
(但我可能会与你的建议为更容易阅读和理解的2行的方式去...)
文章来源: How to assign redirection symbol to a variable for assembling a command line