2

如何将 bash 脚本的 sdterr 重定向到控制台和文件?我在用:

exec 2>> myfile

将其记录到 myfile。如何将其扩展为也登录到控制台?

4

6 回答 6

4

例如:

exec 2>&1 | tee myfile
于 2012-08-09T08:13:46.207 回答
1

或者你可以使用tail -f

$ touch myfile
$ tail -f myfile &
$ command 2>myfile
于 2012-08-09T08:26:33.383 回答
0

尝试在后台通过另一个命令(如 cat)打开该文件。

exec 2>> myfile
cat myfile & >&2
CAT_PID=$!
... # your script
kill $CAT_PID
于 2012-08-09T08:14:49.307 回答
0

你可以创建一个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
于 2012-08-09T08:24:29.920 回答
0

您可以将输出重定向到一个进程并tee在该进程中使用:

#!/usr/bin/env bash

exec 2> >( tee -a err.log )

echo bla >&2
于 2012-08-09T14:06:59.103 回答
0

基于@mpapis 回答的纯 Bash 解决方案:

exec 2> >( while read -r line; do printf '%s\n' "${line}" >&2; printf '%s\n' "${line}" >> err.log; done )

并扩展:

exec 2> >(
    while read -r line; do
      printf '%s\n' "${line}" >&2
      printf '%s\n' "${line}" >> err.log
    done
  )
于 2017-06-22T22:36:56.227 回答