我正在寻找ksh93中的解决方案,让我运行命令并将STDERR和STDIN流捕获到日志文件中。我还希望STDIN和STDERR输出到终端。或者,在某些情况下,我也想将STDIN捕获到日志文件中(但与STDERR分开)。
我有一个部分解决方案,源自Copy stderr and stdout to a file as well as the screen in ksh。我添加了第三个命名管道的代码,这是我遇到问题的地方。
#!/bin/ksh
pipe1="/tmp/mypipe1.$$"
pipe2="/tmp/mypipe2.$$"
pipe3="/tmp/mypipe3.$$"
trap 'rm "$pipe1" "$pipe2"' EXIT
mkfifo "$pipe1"
mkfifo "$pipe2"
mkfifo "$pipe3"
tee -a out1.log < "$pipe1" &
tee -a out2.log >&2 < "$pipe2" &
tee -a out2.log < "$pipe3" &
# Redirect all script output to a logfile as well as their normal locations
exec >"$pipe1"
exec 2>"$pipe2"
exec "$pipe3"<0 # 0: cannot open [No such file or directory]
unzip $1
上面的代码在第20行给出了错误0: cannot open [No such file or directory]
(请参阅代码中的注释)。
如果我尝试使用exec 0>"$pipe3
更改第20行上的重定向顺序,则脚本似乎正常运行,将所有3个I / O流反映到终端
replace ATO-9500.csv? [y]es, [n]o, [A]ll, [N]one, [r]ename: y
inflating: ATO-9500.csv
replace ATO-9501.csv? [y]es, [n]o, [A]ll, [N]one, [r]ename: y
inflating: ATO-9501.csv
replace ATO-9502.csv? [y]es, [n]o, [A]ll, [N]one, [r]ename: A
inflating: ATO-9502.csv
inflating: CAPACITOR-9500.csv
inflating: CAPACITOR-9501.csv
inflating: CAPACITOR-9502.csv
但输出日志(out2.log)不包含用户输入,它还将STDERR输出合并为一行:
replace ATO-9500.csv? [y]es, [n]o, [A]ll, [N]one, [r]ename: replace ATO-9501.csv? [y]es, [n]o, [A]ll, [N]one, [r]ename: replace ATO-9502.csv? [y]es, [n]o, [A]ll, [N]one, [r]ename:
=============
就是说,我已尝试使用进程替换代码here将STDERR捕获到日志文件中,而我的ksh手册页说它支持进程替换,但我还没有能够让它为我工作,所以看起来我已经停止使用更长的方法与命名管道等。