是否可以在 shell 脚本中在重定向 STDOUT 和 STDERR 时写入屏幕?
我有一个 shell 脚本,我想捕获 STDOUT 和 STDERR。该脚本可能会运行一个小时或更长时间,所以我想偶尔向屏幕写入一些状态消息,这些消息将显示而不是重定向(未捕获)。
举个简单的例子,我有一个 shell 脚本,比如说“./myscript.sh”:
#!/bin/sh -u
echo "Message A: This writes to STDOUT or wherever '1>' redirects to."
echo "Message B: This writes to STDOUT or wherever '1>' redirects to.">&1
echo "Message C: This writes to STDERR or wherever '2>' redirects to.">/dev/stderr
echo "Message D: This writes to STDERR or wherever '2>' redirects to.">&2
echo "Message E: Write this to 'screen' regardless of (overriding) redirection." #>???
Run Code Online (Sandbox Code Playgroud)
然后,例如,当我像这样运行脚本时,我希望看到这个输出:
[~]# …
Run Code Online (Sandbox Code Playgroud) func() {
echo 'hello'
echo 'This is an error' >&2
}
a=$(func)
b=???
Run Code Online (Sandbox Code Playgroud)
我想将 stderr 重定向到b
变量而不创建临时文件。
echo $b
# output should be: "This is an error"
Run Code Online (Sandbox Code Playgroud)
有效但使用临时文件的解决方案:
touch temp.txt
exec 3< temp.txt
a=$(func 2> temp.txt);
cat <&3
rm temp.txt
Run Code Online (Sandbox Code Playgroud)
所以问题是,如何在不需要临时文件的情况stderr
下将bash函数的重定向func
到变量b
?