在 exec 命令中通过变量指定重定向选项

在 exec 命令中通过变量指定重定向选项

我希望能够通过变量指定重定向命令/选项(我可能会根据某些条件等进行设置)。但是当我运行此 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

相关内容