posts - 9, comments - 36, trackbacks - 0, articles - 1471
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

公告

linux shell 重定向 减号-的作用

Posted on 2014-10-08 16:50 bw_0927 阅读(...) 评论(...)  编辑 收藏

http://eksliang.iteye.com/blog/2105677

 

管道命令在bash的连续处理程序中是相当重要的,尤其在使用到前一个命令的studout(标准输出)作为这次的stdin(标准输入)时,就显得太重要了,某些命令需要用到文件名,例如上篇文档的的切割命令(split)、还有tar(打包)命令等等!这时这个文件就承当studout或者stdin,这个时候这个studout或者stdin就可以用减号(-)来替代

 实例一:使用ls -al /将输出的信息中,没3行记录成一个文件

Java代码  收藏代码
  1. [root@bogon bash]# ls -al / | split -l 3 - s  
  2. [root@bogon bash]# wc -l s*  
  3.    3 saa  
  4.    3 sab  
  5.    3 sac  
  6.    3 sad  
  7.    3 sae  
  8.    3 saf  
  9.    3 sag  
  10.    2 sah  
  11.   23 total  
  12. #一般来说,如果需要stdout(标准输出)/stdin(标准输入),但偏偏又没有文件,有的只是“-”时,那么那个“-”就会被当做stdout或者stout  

 

实例二:tar -cvf  tarName.tar ./bash 本来是这样的,看我怎么用“-”来替他文件的标准输出

Java代码  收藏代码
  1. [root@bogon ~]# tar -cvf   ./bash  
  2. tar: Cowardly refusing to create an empty archive  
  3. Try `tar --help' or `tar --usage' for more information.  
  4. #这里报错了,没有办法,因为语法错误  
  5. [root@bogon ~]# tar -cvf  - ./bash   
  6. ./bash/  
  7. ./bash/sag  
  8. ./bash/saf  
  9. ./bash/sae  
  10. ./bash/aa.txt  
  11. ./bash/sab  
  12. ./bash/saa  
  13. ./bash/sad  
  14. ./bash/cc.txt  
  15. ./bash/bb.txt  
  16. ./bash/test.txt  
  17. .....  
  18. #看到了没有这个时候用”-“替代了本来输出到文件,而标准输出到了屏幕  

 

    实例三:综合实例

Java代码  收藏代码
  1. [root@bogon ~]# tar -cvf - ./bash | tar -xvf -  
  2. ./bash/  
  3. ./bash/sag  
  4. ./bash/saf  
  5. ......!(省略)  
  6. ./bash/saf  
  7. ./bash/sah  
  8. ./bash/sac  
  9. tar: ./bash: file changed as we read it  
  10. ./bash/sae  
  11. .......!省略)  
  12. ./bash/sah  
  13. ./bash/sac  

  上面这个例子是说我将./bash这个文件打包,但是打包的文件不是记录到文件,而是传送到标准输出(stdout);经过管道后,将tar -cvf - ./bash传给后面的tar -xvf -。后面这个“-”则是取用前面一个命令的stdout作为stdin,因此这里就不需要使用文件了,这是很常见的例子,因为我们写脚本的时候,就不要去写个临时文件了。

==================================

http://blog.csdn.net/ithomer/article/details/9288353

shell中可能经常能看到:echo log > /dev/null 2>&1

 

命令的结果可以通过%>的形式来定义输出

/dev/null :代表空设备文件
>  :代表重定向到哪里,例如:echo "123" > /home/123.txt
1  :表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"
2  :表示stderr标准错误
&  :表示等同于的意思,2>&1,表示2的输出重定向等同于1

1 > /dev/null 2>&1 语句含义:
1 > /dev/null : 首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。
2>&1 :接着,标准错误输出重定向(等同于)标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。

 

实例解析:

 

cmd >a 2>a cmd >a 2>&1 为什么不同?
cmd >a 2>a :stdout和stderr都直接送往文件 a ,a文件会被打开两遍,由此导致stdout和stderr互相覆盖。
cmd >a 2>&1 :stdout直接送往文件a ,stderr是继承了FD1的管道之后,再被送往文件a 。a文件只被打开一遍,就是FD1将其打开。

 

两者的不同点在于:

 

cmd >a 2>a 相当于使用了FD1、FD2两个互相竞争使用文件 a 的管道;
cmd >a 2>&1 只使用了一个管道FD1,但已经包括了stdout和stderr。
从IO效率上来讲,cmd >a 2>&1的效率更高。

 

file > /dev/null 2>&1 </dev/null

The "file" part may be a variable part representing any command. The >/dev/null redirects the standard output to /dev/null, throwing it away. The "2>&1" part redirects the "standard error" output of the command to to the stardard output. the "</dev/null" unattaches the console keyboard and uses "</dev/null" instead. This will allow the program to run in the background without being blocked.

 

 

make 2>&1 | tee log.1