首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在bash中设置两个重定向级别?

如何在bash中设置两个重定向级别?
EN

Stack Overflow用户
提问于 2013-02-11 17:57:46
回答 2查看 559关注 0票数 2

在bash脚本中,我想:

  1. 将每个日志输出到一个文件(loglowlevel.txt)中,
  2. 但是使在终端(高级)中只能看到很少的
  3. 我有20个高级日志和60个低级别日志。因此,我想保持低级别的日志“重定向-命令”是免费的,并且只将重定向的内容转到高级日志。

取1

我编写了一个将stdoutsterr重定向到FD 3的基本脚本,正确地填充了loglowlevel.txt。但是,我不得不为高级日志指定选项。

代码语言:javascript
复制
#!/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>&-

它所做的事情如下:

代码语言:javascript
复制
$ redirect.sh
$ cat loglowlevel.txt 
low-level comment
ls: cannot access notafile: No such file or directory

我预计high-level comment也会被打印在终端上。

采取2

第二个脚本,不同的策略:

代码语言:javascript
复制
#!/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

它所做的事情如下:

代码语言:javascript
复制
$ 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

这里有两个问题:

  1. 来自ls的错误消息在终端中打印,而我只需要在loglowlevel.txt中。
  2. high-level comment 1loglowlevel.txt被吃掉了。

问题

我更喜欢背后的想法--采取1。但是,如何使high-level comment输出到stdout,同时保留两个exec命令?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-11 18:10:58

代码语言:javascript
复制
#!/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
票数 3
EN

Stack Overflow用户

发布于 2013-02-11 19:29:13

对于支持进程替换的shell和操作系统,威廉·珀塞尔( William )的答案有一个较短的版本:

代码语言:javascript
复制
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标准的一部分,但至少由bashkshzsh提供。每个shell都需要一定数量的操作系统支持。例如,bash版本要求提供命名管道(威廉的解决方案中mkfifo创建的对象)或通过/dev/fd访问打开的文件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14817988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档