gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 09:12:13 25 4
gpt4 key购买 nike

我有几个 BASH 脚本可以启动我经常使用的程序,这些程序使用命令和参数的变量来使用公共(public)参数。调用出现在最后,如下所示:

$PROGRAM $ARG1 $ARG2 &

现在我想默认将输出重定向到 stderr 和 stdout 到 /dev/null。我希望能够通过切换到脚本 (-v = verbose) 来禁用它。但是,如果我尝试将 "2>&1 >/dev/null" 分配给 var,比如 REDIRECTION,(如果指定了冗长则清除它)并尝试调用所以:

$PROGRAM $ARG1 $ARG2 $REDIRECTION &

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

最佳答案

一个选择是使用 eval 内置函数,它像 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:顺序很重要。)

关于bash - 如何将重定向符号分配给变量以组装命令行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12944821/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com