假设我有一个如下脚本:
没用的.sh
echo "This Is Error" 1>&2 echo "This Is Output"
我还有另一个 shell 脚本:
也无用.sh
./useless.sh | sed 's/Output/Useless/'
我想将 “This Is Error” 或 useless.sh 中的任何其他标准错误捕获到一个变量中。我们称之为错误。
请注意,我正在使用标准输出。我想继续使用标准输出,所以在这种情况下将标准错误重定向到标准输出是没有帮助的。
所以,基本上,我想做
./useless.sh 2> $ERROR | ...
但这显然行不通。
我也知道我能做到
./useless.sh 2> /tmp/Error ERROR=`cat /tmp/Error`
但这是丑陋和不必要的。
不幸的是,如果这里没有答案,那就是我必须要做的。
我希望有另一种方法。
有人有更好的想法吗?
因此捕获错误文件会更整洁:
ERROR=$(</tmp/Error)
shell 可以识别这一点,并且不必运行 ‘ cat‘ 来获取数据。
cat
更大的问题很难。我不认为有一个简单的方法可以做到这一点。您必须将整个管道构建到子 shell 中,最终将其最终标准输出发送到文件,以便您可以将错误重定向到标准输出。
ERROR=$( { ./useless.sh | sed s/Output/Useless/ > outfile; } 2>&1 )
请注意,分号是必需的(在经典的 shell - Bourne、Korn - 当然;也可能在 Bash 中)。’ {}‘ 对封闭的命令进行 I/O 重定向。如所写,它也会从中捕获错误sed。
{}
sed
警告: 正式未经测试的代码 - 使用风险自负。