在bash脚本中,我想:
loglowlevel.txt)中,取1
我编写了一个将stdout和sterr重定向到FD 3的基本脚本,正确地填充了loglowlevel.txt。但是,我不得不为高级日志指定选项。
#!/bin/bash -
# create fd 3
exec 3<> loglowlevel.txt
# redirect stdout and stderr to fd 3
exec 1>&3
exec 2>&3
# high-level logs' redirection below is wrong
echo "high-level comment" 3>&1
# low-level logs should remain redirection-free, as below
echo "low-level comment"
ls notafile
# close fd 3
3>&-它所做的事情如下:
$ redirect.sh
$ cat loglowlevel.txt
low-level comment
ls: cannot access notafile: No such file or directory我预计high-level comment也会被打印在终端上。
采取2
第二个脚本,不同的策略:
#!/bin/bash -
function echolowlevel() {
echo $1 &>loglowlevel.txt
}
function echohighlevel() {
echo $1 |& tee loglowlevel.txt
}
echohighlevel "high-level comment 1"
echolowlevel "low-level comment 1"
echohighlevel "high-level comment 2"
ls notafile它所做的事情如下:
$ redirect.sh
high-level comment 1
high-level comment 2
ls: cannot access notafile: No such file or directory
$ cat loglowlevel.txt
high-level comment 2这里有两个问题:
ls的错误消息在终端中打印,而我只需要在loglowlevel.txt中。high-level comment 1在loglowlevel.txt被吃掉了。问题
我更喜欢背后的想法--采取1。但是,如何使high-level comment输出到stdout,同时保留两个exec命令?
发布于 2013-02-11 18:10:58
#!/bin/sh
FIFO=/tmp/fifo.$$ # or use tmpfile, or some other mechanism to get unique name
trap 'rm -f $FIFO' 0
mkfifo $FIFO
tee -a loglowlevel.txt < $FIFO &
exec >> loglowlevel.txt
exec 3> $FIFO
echo high-level >&3 # Appears on original stdout and in loglowlevel.txt
echo low-level # Appears only in loglowlevel.txt发布于 2013-02-11 19:29:13
对于支持进程替换的shell和操作系统,威廉·珀塞尔( William )的答案有一个较短的版本:
exec 3>> >(tee -a loglowlevel.txt)
exec >> loglowlevel.txt
echo high-level >&3 # Appears on original stdout and in loglowlevel.txt
echo low-level # Appears only in loglowlevel.txt在本例中,向文件描述符3写入对附加到文件“tee”的背景loglowlevel.txt进程的标准输入有效。
对此特性的支持各不相同。它不是POSIX标准的一部分,但至少由bash、ksh和zsh提供。每个shell都需要一定数量的操作系统支持。例如,bash版本要求提供命名管道(威廉的解决方案中mkfifo创建的对象)或通过/dev/fd访问打开的文件。
https://stackoverflow.com/questions/14817988
复制相似问题