首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何输出到屏幕覆盖重定向

如何输出到屏幕覆盖重定向
EN

Unix & Linux用户
提问于 2014-01-04 18:26:44
回答 3查看 27.8K关注 0票数 12

在shell脚本中,是否有可能在STDOUT和STDERR被重定向时将其写入屏幕?

我有一个shell脚本,我想捕获STDOUT和STDERR。脚本将运行一个小时或更长时间,因此我希望偶尔将一些状态消息写入屏幕,这些消息将被显示,并且不会被重定向(而不是捕获)。

例如,我有一个shell脚本,比方说"./myscript.sh":

代码语言:javascript
复制
#!/bin/sh -u

echo "Message A: This writes to STDOUT or wherever '1>' redirects to."
echo "Message B: This writes to STDOUT or wherever '1>' redirects to.">&1
echo "Message C: This writes to STDERR or wherever '2>' redirects to.">/dev/stderr
echo "Message D: This writes to STDERR or wherever '2>' redirects to.">&2
echo "Message E: Write this to 'screen' regardless of (overriding) redirection." #>???  

然后,例如,当我像这样运行脚本时,我希望看到这个输出:

代码语言:javascript
复制
[~]# ./myscript.sh > fileout 2> filerr
Message E: Write this to 'screen' regardless of (overriding) redirection.
[~]# ./myscript.sh > /dev/null 2>&1
Message E: Write this to 'screen' regardless of (overriding) redirection.
[~]#    

如果不能“直接”执行,是否可以暂时停止重定向,然后打印到屏幕上,然后恢复原来的重定向?

关于电脑的一些信息:

代码语言:javascript
复制
[~]# uname -srvmpio
Linux 3.2.45 #4 SMP Wed May 15 19:43:53 CDT 2013 x86_64 x86_64 x86_64 GNU/Linux

[~]# ls -l /bin/sh /dev/stdout /dev/stderr
lrwxrwxrwx 1 root root  4 Jul 18 23:18 /bin/sh -> bash
lrwxrwxrwx 1 root root 15 Jun 29  2013 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 Jun 29  2013 /dev/stdout -> /proc/self/fd/1
EN

回答 3

Unix & Linux用户

发布于 2014-01-04 22:18:05

试试这样的脚本:

代码语言:javascript
复制
#!/bin/bash
echo "to fd1" >&1
echo "to fd2" >&2
echo "to screen" >$(tty)

当你叫它时,它看起来是这样的:

代码语言:javascript
复制
user@host:~# ./script
to fd1
to fd2
to screen
user@host:~# ./script 1>/dev/null
to fd2
to screen
user@host:~# ./script 2>/dev/null
to fd1
to screen
user@host:~# ./script > /dev/null 2>&1
to screen
票数 6
EN

Unix & Linux用户

发布于 2014-10-08 18:23:53

我不知道所有的tty重定向,但这就是我要做的:

不要实际重定向,而是将所需的输出作为参数发送,或者,如果要在脚本本身中重定向,则可以通过执行以下操作在任何时候切换重定向:

代码语言:javascript
复制
exec 2> /some/new/destination 1> /some/other/destination

但你也许想救那些老的..。

代码语言:javascript
复制
exec  3>&1 4>&2 2> /some/new/destination 1> /some/other/destination

这样你才能回到原点..。当您完成时,或想写到屏幕上

写到屏幕上:echo "message" 1>&3

或者..。

全部完成:exec 1>&3 2>&4 #一切恢复正常:)

票数 3
EN

Unix & Linux用户

发布于 2014-01-06 14:28:36

使用混乱的答案中的例子:

代码语言:javascript
复制
echo "to screen" >$(tty)

对我不起作用。当我试图使用它时,我会出错:

代码语言:javascript
复制
./myscript.sh: line xx: /dev/pts/3: Permission denied

我想出了一个解决方案来使用另一个文件描述符(9)。这里是"./myscript.sh":

代码语言:javascript
复制
#!/bin/sh -u

## This is placed one time at the top of the script  
## to detect if file descriptor (9) is available for writing.
if [ ! -t 3 ]; then
    echo "Error, file descriptor (9) not open on terminal." >&2
    echo "" >&2
    if [ ! -t 2 ]; then
        echo "Error, file descriptor (9) not open on terminal."
        echo ""
    fi
    exit 1
fi

echo "Message A: This writes to stdout or wherever '1>' redirects to."
echo "Message B: This writes to stdout or wherever '1>' redirects to.">&1
echo "Message C: This writes to stderr or wherever '2>' redirects to.">/dev/stderr
echo "Message D: This writes to stderr or wherever '2>' redirects to.">&2
echo "Message E: Write this to 'screen' regardless of '1>/2>' redirection." >&9
echo " " >&9

我使用文件描述符9将“状态”消息输出到,但是其他有效的文件描述符应该可以工作。

要使用它,在调用脚本时,必须将文件描述符(9)重定向到STDOUT (9>&1)作为第一个重定向。

下面是我调用“./myscript.sh”时的输出:

代码语言:javascript
复制
[~]# ./myscript.sh
[~]# ./myscript.sh >/dev/null
[~]# ./myscript.sh 2>/dev/null
Error, file descriptor (9) not open on terminal.

[~]# ./myscript.sh >/dev/null 9>&1
Error, file descriptor (9) not open on terminal.

[~]# ./myscript.sh 9>&1 >/dev/null
Message C: This writes to stderr or wherever '2>' redirects to.
Message D: This writes to stderr or wherever '2>' redirects to.
Message E: Write this to 'screen' regardless of '1>/2>' redirection.

[~]# ./myscript.sh 9>&1 2>/dev/null
Message A: This writes to stdout or wherever '1>' redirects to.
Message B: This writes to stdout or wherever '1>' redirects to.
Message E: Write this to 'screen' regardless of '1>/2>' redirection.

[~]# ./myscript.sh 9>&1 >/dev/null 2>&1
[~]# ./myscript.sh 9>&1 &>/dev/null
[~]# ./myscript.sh 9>&1 >&/dev/null
Message E: Write this to 'screen' regardless of '1>/2>' redirection.

[~]#
票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/107861

复制
相关文章

相似问题

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