1>&2, 2>&1, &>

进行一个标准输出、标准错误输出分流的试验:

edemon@ubuntu1:~/workspace$ ./test.sh
hello world
./test.sh: line 3: pt: command not found
edemon@ubuntu1:~/workspace$ ./test.sh 1>out 2>err
edemon@ubuntu1:~/workspace$ vim -O out err
2 files to edit

现在尝试直接重定向标准错误到标准输出:
edemon@ubuntu1:~/workspace$ ./test.sh 2>1

但是很遗憾,出现这样的结果:
hello world

接着我们能发现一个新的文本1,并在文件1中发现错误信息。
bash将1当做了一个普通文件。
使用2 >& 1是为了避免这样的坏事发生。

edemon@ubuntu1:~/workspace$ ./test.sh 2 >& 1
hello world
./test.sh: line 3: pt: command not found
# 或者改成:
edemon@ubuntu1:~/workspace$ ./test.sh 2>/dev/stdout
hello
./test.sh: line 3: pt: command not found

能在2的前面加上&吗?不能,bash会将sh脚本在后台执行。

edemon@ubuntu1:~/workspace$ ./test.sh &2 >& 1
[1] 3497
hello world
./test.sh: line 3: pt: command not found
2: command not found
[1]+  Exit 127                ./test.sh

总结:
1和2是文件描述符,而不是文件,需要加上&告诉bash。

例如:

$ cat read
this is a story about hero
text block

# 创建文件描述符3
$ exec 3<read

$ ls
#没有产生文件3
checkRoot.sh  delete.sh  envi.sh  interc.sh  output.sh  read  read1  strlen.sh  test.sh

$ cat <&3
this is a story about hero
text block


1>&2 意思是把标准输出重定向到标准错误.
2>&1 意思是把标准错误输出重定向到标准输出。

&>2>&1 >的缩写

&>filename 意思是把标准输出和标准错误输出都重定向到文件filename中

例如:

$ cat read 2>&1 > read1
$ cat read1
this is a story about hero
text block

$ cat /dev/null > read1

$ cat read &> read1
$ cat read1
this is a story about hero
text block
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值