![在 exec 命令中通过变量指定重定向选项](https://linux22.com/image/91219/%E5%9C%A8%20exec%20%E5%91%BD%E4%BB%A4%E4%B8%AD%E9%80%9A%E8%BF%87%E5%8F%98%E9%87%8F%E6%8C%87%E5%AE%9A%E9%87%8D%E5%AE%9A%E5%90%91%E9%80%89%E9%A1%B9.png)
我希望能够通过变量指定重定向命令/选项(我可能会根据某些条件等进行设置)。但是当我运行此 bash 脚本时:
REDIRECT=">>test"
exec echo hi ${REDIRECT}
我得到(通过 bash -x 输出):
+ REDIRECT='>>test'
+ exec echo hi '>>test'
hi >>test
看起来 exec 将 REDIRECT 变量的值放在单引号内,而不是逐字替换它的值。
我该如何解决/解决这个问题?
答案1
为了避免使用eval
:
opt_file=""
# Command line parsing bit here, setting opt_file to a
# file name given by the user, or leaving it empty.
if [[ -z "$opt_file" ]]; then
outfile="/dev/stdout"
else
outfile="$opt_file"
fi
exec echo hi >>"$outfile"
一个稍微短一点的变体,可以做同样的事情:
# (code that sets $opt_out to a filename, or not,
# and then...)
outfile=${opt_file:-/dev/stdout}
exec echo hi >>"$outfile"
答案2
我认为做到这一点的唯一方法是使用eval
和所有经典警告大约eval
适用。也就是说,你可以这样做:
REDIRECT=">>test"
eval echo hi ${REDIRECT}
答案3
您可以使用以下命令将整个文件重定向stdout
到一个文件exec
,例如
exec >> outfile
现在任何输出都将发送到outfile
.
例如:
#!/bin/bash
exec >> outfile
echo start
echo hello
echo there
echo end
如果我们运行这个:
$ ./x
$ cat outfile
start
hello
there
end
$ ./x
$ cat outfile
start
hello
there
end
start
hello
there
end
所以我们可以看到每次执行都会追加。
添加到测试中变得很简单
if [ -n "$REDIRECT" ]
then
exec >> $REDIRECT
fi