如何以编程方式在 bash 中创建输出重定向

How to programmatically create output redirection in bash

我正在编写一个测试脚本,其中有很多重复,我正在寻找减少这些代码重复的方法。 所以我认为以编程方式创建命令的重定向部分会很好。

这是一个最小的例子:(在真实的脚本中,我会在 x() 中生成不同的输出文件名)

#!/bin/bash

set -x

x() {
  echo '> out.txt 2> err.txt'
}

./someProgram $(x)

我希望 stdout 会在 out.txt 中结束,stderr 会在 err.txt 中结束。 但是 bash 引用了字符串。所以生成的命令是 ./someProgram '>' out.txt '2>' err.txt 而不是 ./someProgram > out.txt 2> err.txt.

示例的输出如下:

++ x
++ echo '> out.txt   2> err.txt'
+ ./someProgram '>' out.txt '2>' err.txt
.....

那么 '>''2>' 是否有可能不会被引用?

没有更多的上下文很难理解,但您可能只是想明智地使用 exec。我不会保证以下内容的可移植性,但在 bash 5.0.16 中你可以这样做:

x() { shift; "$@"; } > .out 2> .err
x filename ./someProgram

到运行./someProgram,输出指向filename.out,错误流写入filenmae.err