加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 这些流重定向如何工作?

发布时间:2020-12-15 21:37:47 所属栏目:安全 来源:网络整理
导读:从 this perldoc page, 要一起捕获命令的STDERR和STDOUT: ? $output = `cmd 21`; 捕获命令的STDOUT但丢弃其STDERR: ? $output = `cmd 2/dev/null`; 捕获命令的STDERR但丢弃其STDOUT(这里的排序很重要): ? $output = `cmd 21 1/dev/null`; 要交换命令的STD
从 this perldoc page,

>要一起捕获命令的STDERR和STDOUT:

?

$output = `cmd 2>&1`;

>捕获命令的STDOUT但丢弃其STDERR:

?

$output = `cmd 2>/dev/null`;

>捕获命令的STDERR但丢弃其STDOUT(这里的排序很重要):

?

$output = `cmd 2>&1 1>/dev/null`;

>要交换命令的STDOUT和STDERR以捕获STDERR,但让其STDOUT退出旧的STDERR:

?

$output = `cmd 3>&1 1>&2 2>&3 3>&-`;

我不明白3和4是如何工作的,我不太清楚我对1和2的理解是对的.以下是我的理解.请纠正我错在哪里.

我知道0,1和2表示STDIN,STDOUT和STDERR.

>重定向2到1,以便它们现在都使用相同的流(& escapeped 1确保STDERR不会被重定向到名为1的文件)
>将2(STDERR)重定向到空流,以便它被丢弃
>我不明白这个.不应该只是

$output = `cmd 1>/dev/null`;

另外,如果目标是在STDOUT获取STDERR消息,那么1> / dev / null是否会将所有内容重定向到/ dev / null?
>这里发生了什么?什么是第3流?它是一个临时变量吗?

解决方法

真的,这些都不是Perl – 所有这些都是由你使用反引号运算符调用的shell处理的.所以你最好的阅读是man sh,或 Shell chapter of the Unix standard.

简而言之,对于#4:

> 3>& 1:打开FD 3以指向stdout当前指向的位置.> 1>& 2:重新打开标准输出以指向stderr当前指向的位置.> 2>& 3:重新打开stderr以指向FD 3当前指向的位置,这是stdout在上一步骤完成之前指向的位置.现在stdout和stderr已成功交换.> 3>& – :关闭FD 3,因为它不再需要了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读