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

bash – Bourne shell中的“2 <&1”重定向是什么?

发布时间:2020-12-16 01:22:36 所属栏目:安全 来源:网络整理
导读:Bourne shell中的2 1重定向将输出发送到文件描述符2(默认为标准错误),并将其发送到文件描述符1(默认为标准输出). 但是,2 1重定向是做什么的? 它是否发送stderr到stdin? 我的理论是,它将stdin发送到stderr(例如与1 2 2)相同),但是从实验上说,情况并非如此:
Bourne shell中的2& 1重定向将输出发送到文件描述符2(默认为标准错误),并将其发送到文件描述符1(默认为标准输出).

但是,2< 1重定向是做什么的? 它是否发送stderr到stdin? 我的理论是,它将stdin发送到stderr(例如与1& 2& 2)相同),但是从实验上说,情况并非如此:

$perl -e 'print "OUTn"; print STDERR "ERRn"; 
  while (<>) { print "IN WAS $_n";}'           
  > out3 2<&1
df
$cat out3
ERR
OUT
IN WAS df

请注意,标准输出和标准错误都转到文件out3,其中stdout被重定向.

<&操作符复制“输入”文件描述符.根据IEEE Std 1003.1-2001(也称为单独Unix规范v3,POSIX的后继者),如果1不是文件描述符打开输入,则假定为2<& 1是错误的.但是,似乎bash是懒惰的,不关心文件描述符是否打开输入或输出. 因此,2< 1和2& 1简单地执行将文件描述符1复制到文件描述符2的系统调用dup2(1,2). 您可以通过运行这样的命令进行检查,因为重定向是从左到右执行的:
sleep 99999 1>/dev/null 2<&1

然后在另一个窗口中,在睡眠进程中运行lsof.您将看到文件描述符1和2都指向/ dev / null.示例(在我的Mac上):

:; ps axww | grep sleep
 8871 s001  R+     0:00.01 grep sleep
 8869 s003  S+     0:00.01 sleep 99999
:; lsof -p 8869 | tail -2
sleep   8869 mayoff    1w   CHR    3,2       0t0       316 /dev/null
sleep   8869 mayoff    2w   CHR    3,2       0t0       316 /dev/null

(编辑:李大同)

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

    推荐文章
      热点阅读