如何以编程方式在 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
我正在编写一个测试脚本,其中有很多重复,我正在寻找减少这些代码重复的方法。 所以我认为以编程方式创建命令的重定向部分会很好。
这是一个最小的例子:(在真实的脚本中,我会在 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