如何将 bash 脚本的 sdterr 重定向到控制台和文件?我正在使用:
exec 2>> myfile
以将其记录到我的文件。如何将其扩展到控制台?
例如:
exec 2>&1 | tee myfile
或者你可以使用tail -f
$ touch myfile
$ tail -f myfile &
$ command 2>myfile
您可以创建 fifo
$ mknod mypipe p
让 Tee 从 FIFO 中读取。它写入标准输出和您指定的文件
$ tee myfile <mypipe &
[1] 17121
现在运行命令并将 stderr 通过管道传输到 FIFO
$ ls kkk 2>mypipe
ls: cannot access kkk: No such file or directory
[1]+ Done tee myfile < mypipe
尝试在后台通过另一个命令(如cat)打开该文件。
exec 2>> myfile
cat myfile & >&2
CAT_PID=$!
... # your script
kill $CAT_PID
基于@mpapis的答案的纯Bash解决方案:
exec 2> >( while read -r line; do printf '%sn' "${line}" >&2; printf '%sn' "${line}" >> err.log; done )
并扩展:
exec 2> >(
while read -r line; do
printf '%sn' "${line}" >&2
printf '%sn' "${line}" >> err.log
done
)
您可以将输出重定向到进程并在该进程中使用tee
:
#!/usr/bin/env bash
exec 2> >( tee -a err.log )
echo bla >&2