加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

BASH & CSH linux  重定向(ZZ)

(2016-05-15 12:16:34)

bash:

FROM: http://19542002.blog.163.com/blog/static/1339323822010101174915363/


准则 1. 输入

应该允许输入来自以下两种方式:

  • 在命令行上指定的文件名。例如:

    $ command input_file
    

    在这个例子中,command 应该读取文件 input_file。

  • 标准输入(stdin),缺省情况下为终端(也就是用户的键盘)。例如:

    $ command
    

    这里,用户输入 Control-D(文件结束指示符)前输入的所有内容都成为 command 的输入。

但是,使用 shell 操作符“<”(重定向标准输入),也可将标准输入重定向为来自文件,如下所示:

 

$ command < input_file

 

这里,command 会读它的标准输入,不过 shell/内核已将其重定向,所以标准输入来自 input_file。

使用 shell 操作符“|”(pipe)也可以使标准输入来自另一个程序的标准输出,如下所示:

 

$ other_command | command

 

这里,other_command 的标准输出(stdout)被 shell/内核透明地传递至 command 的标准输入。

准则 2. 输出

输出应该被写至标准输出,缺省情况下标准输出同样也是终端(也就是用户的屏幕):

 

$ command

 

在这个例子中,command 的输出出现在屏幕上。

同样,使用 shell 操作符“>”(重定向标准输出)可以将标准输出重定向至文件。

 

$ command > output_file

 

这里,command 仍然写至它的标准输出,不过 shell/内核将其重定向,所以输出写至 output_file。

或者,还是使用“|”操作符,command 的输出可以成为另一个程序的标准输入,如下所示:

 

$ command | other_command

 

在这个例子中,shell/内核安排 command 的输出成为 other_command 的输入。

准则 3. 错误输出

错误输出应该被写至标准错误(stderr),缺省情况下标准错误同样也是终端(也就是用户的屏幕):

 

$ command

 

这里,运行 command 时出现的任何错误消息都将被写至屏幕。

但是使用标准错误重定向,也可以将错误重定向至文件。例如:

 

$ command 2>error_file

 

在这个例子中,command 的正常输出在屏幕显示,而任何错误消息都被写至 error_file。

可以将标准输出和标准错误都重定向至不同的文件,如下所示:

 

$ command >output_file 2>error_file

 

这里,将标准输出写至 output_file,而将所有写至标准错误的内容都写至 error_file。

如果已将标准输出重定向至某一位置,也可以将标准错误重定向至同一位置。例如:

 

$ command 2>&1

 

在这个例子中,符号“2>&1”表示“将标准错误发送至标准输出被重定向的任何位置”,因此错误和正常的消息都将在屏幕上显示。当然,这是多余的,因为下面简单的调用

 

$ command

 

将做同样的事。在标准输出已被重定向至其它源,而您希望在同一命令行上将标准错误也写至同一目的地时,该特性就非常有用。例如:

 

$ command >output_file 2>&1

 

在这个例子中,已首先将标准输出重定向至 output_file;因此“2>&1”将使标准错误也被重定向至 output_file。


* /script/myscript.sh 1> /dev/null 2>&1
其中 1> /dev/null 2>&1是什么意思??
dev/null 为系统垃圾箱
&为后台运行
但是 myscript 后面的1 和 /null后面的2 还有 &后面的1是什么意思?
1代表标准输出,2代表错误信息输出.
1>/dev/null 就是指将标准输出定向到空设备,
2>&1,的意思是将错误输出定向到和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的效率更高。

in UNIX 
0 = stdin 
1 = stdout 
2 = stderr 

csh:
BSD的sh和csh的重定向操作符全解

预先的知识一:
引用: noclobber 禁止覆盖变量,设定 $noclobber 预设变量改变输出重定向特性
    

变量设定语法 set noclobber
    取消变量设定语法 unset noclobber

    这个 noclobber 变量,它的功能便是停止重定向符号“>”的覆盖(overwiting)已存在文件以及符号“>>”要将字符写入一个不存在的文件时,自动产生该文件的特性。

仅用两个例子让读者明白,设定后的实际使用状况。
例子一:
        
ps axu testfile
        set noclobber
        echo "test set noclobber" testfile
        testfile: File exists.
        echo "test set noclobber" >! testfile
        %


        例子二:
        
set noclobber
        cat /etc/passwd >> nopass
        nopass: No such file or directory
        cat /etc/passwd >>! nopass
        %



预先的知识二:
引用: 输入输出位置文件句柄:
STDIN(标准输入/Standard Input) 0
STDOUT(标准输出/Standard output) 1
STDERR(标准错误/Standard error) 2



引用:
>file   csh, sh 
将 STDOUT(标准输出/Standard output) 重定向到文件
command file

>>file  csh, sh
将 STDOUT(标准输出/Standard output) 字符串加到文件内容之后
command >> file


将文件重定向到 STDIN(标准输入/Standard Input) 作为命令的输入
command file

<<word  csh, sh 
读取在线输入直到word(结束输入时,结束行输入word), 并做输入内容的变量替换
command <<word

<<\word  csh, sh
读取在线输入直到word(结束输入时,结束行输入word), 不做输入内容的变量替换
command <<\word

<<-word  sh 
读取在线输入直到word(结束输入时,结束行输入word), 忽略TABS(制表符)
command <<-word

>>!file  csh
将 STDOUT(标准输出/Standard output) 字符串追加到文件内容之后,当设定 $noclobber 时,可重写文件。
command >>! file

>!file  csh
将 STDOUT(标准输出/Standard output) 重定向到新文件,当设定 $noclobber 时,可重写文件。
command >! file

>&file  csh 
将 STDOUT(标准输出/Standard output) 及 STDERR(标准错误/Standard error) 重定向到文件
command >& file

>>& csh
将 STDOUT(标准输出/Standard output) 及 STDERR(标准错误/Standard error) 字符串追加到文件内容之后
command >>& file

<&digit  sh 
切换 STDIN(标准输入/Standard Input) 到文件句柄
command >cmd.log 2<&1

<&-  sh 
关闭 STDIN(标准输入/Standard Input)
command <&-

>&digit  sh 
切换 STDOUT(标准输出/Standard output) 到文件句柄
command >cmd.log 2>&1

>&-  sh 
关闭 STDOUT(标准输出/Standard output)
command >&-

>&! csh
将 STDOUT(标准输出/Standard output) 及 STDERR(标准错误/Standard error) 重定向到文件,当设定 $noclobber 时,可重写文件。
command >&! file

>>&! csh
将 STDOUT(标准输出/Standard output) 及 STDERR(标准错误/Standard error) 字符串加到文件内容之后,当设定 $noclobber 时,可重写文件。
command >>&! file



预先的知识二: 
引用: 输入输出位置文件句柄: 
STDIN(标准输入/Standard Input) 0 
STDOUT(标准输出/Standard output) 1 
STDERR(标准错误/Standard error) 2
引用: 
>file   csh, sh    
将 STDOUT(标准输出/Standard output) 重定向到文件 
(command > file) 
>>file  csh, sh   
将 STDOUT(标准输出/Standard output) 字符串加到文件内容之后 
(command >> file

>>!file  csh   
将 STDOUT(标准输出/Standard output) 字符串追加到文件内容之后,当设定 $noclobber 时,可重写文件。 
(command >>! file) 
>!file  csh   
将 STDOUT(标准输出/Standard output) 重定向到新文件,当设定 $noclobber 时,可重写文件。 
(command >! file) 
>&file  csh   
将 STDOUT(标准输出/Standard output) 及 STDERR(标准错误/Standard error) 重定向到文件 
(command >& file) 
>>&file csh 
将 STDOUT(标准输出/Standard output) 及 STDERR(标准错误/Standard error) 字符串追加到文件内容之后 
(command >>& file) 
cmd.log 2

>&digit  sh   
切换 STDOUT(标准输出/Standard output) 到文件句柄 
(command >cmd.log 2>&1) 
>&-  sh   
关闭 STDOUT(标准输出/Standard output) 
(command >&-) 
>&! csh 
将 STDOUT(标准输出/Standard output) 及 STDERR(标准错误/Standard error) 重定向到文件,当设定 $noclobber 时,可重写文件。 
(command >&! file) 
>>&! csh 
将 STDOUT(标准输出/Standard output) 及 STDERR(标准错误/Standard error) 字符串加到文件内容之后,当设定 $noclobber 时,可重写文件。 
(command >>&! file) 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有