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

如何在bash中以编程方式创建输出重定向,bash,io-redirection,Bash,Io Redirection,我正在编写一个测试脚本,其中有很多重复,我正在寻找减少这些代码重复的方法。 因此,我认为以编程方式创建命令的重定向部分会很好 下面是一个简单的示例:(在实际脚本中,我将在x()中生成不同的输出文件名) 我希望stdout将以out.txt和stderr的err.txt结尾。 但是bash引用了字符串。因此,生成的命令是/someProgram'>'out.txt'2>'err.txt,而不是/someProgram>out.txt 2>err.txt 以下是示例的输出: ++ x ++ echo

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

下面是一个简单的示例:(在实际脚本中,我将在
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; "$@"; } > $1.out 2> $1.err
x filename ./someProgram

要运行
/someProgram
,将输出定向到
filename.out
,并将错误流写入
filenmae.err

,如果没有更多的上下文,很难进行操作,但您可能只想明智地使用
exec
。我不会保证以下内容的可移植性,但在bash 5.0.16中,您可以做到:

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

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

也许您只是想
exec>out.txt 2>err.txt
您考虑过反转流吗?与
someProgram$(x)
不同,您可以这样做:
x someProgram
,即
x
函数接受一个可执行文件以及可选参数,并根据您的意愿重定向其stdout和stderr。如果您只想
exec>out.txt 2>err.txt
您考虑过反转流吗?您可以这样做,而不是
someProgram$(x)
x someProgram
,即
x
函数接受可执行文件以及可选参数,并重定向其stdout和stderr(如您所愿),我不保证以下内容的可移植性对此有点不清楚,表示在复合命令执行过程中,命令的操作数临时成为位置参数;但是我认为他们应该支持这种用法,这真的很酷。
exec
不是正确的方法,而是重新思考流程。我对
shift
使用了与您类似的方法。感谢您的洞察力/灵感!请注意,我不保证以下的可移植性,但在这方面有点不清楚,它说在复合命令执行期间,命令的操作数暂时将成为位置参数;但是我认为他们应该支持这种用法,这真的很酷。
exec
不是正确的方法,而是重新思考流程。我对
shift
使用了与您类似的方法。感谢您的洞察力/灵感!