#可以相互转换情况
#输入重定向
[chengmo@centos5 shell]$
cat
test
.sh|
grep
-n
'echo'
5:
echo
"very good!"
;
7:
echo
"good!"
;
9:
echo
"pass!"
;
11:
echo
"no pass!"
;
#"|"管道两边都必须是shell命令
[chengmo@centos5 shell]$
grep
-n
'echo'
<
test
.sh
5:
echo
"very good!"
;
7:
echo
"good!"
;
9:
echo
"pass!"
;
11:
echo
"no pass!"
;
#"重定向"符号,右边只能是文件(普通文件,文件描述符,文件设备)
[chengmo@centos5 shell]$ mail -s
'test'
8292669@qq.com <
test
.sh
[chengmo@centos5 shell]$
cat
test
.sh|mail -s
'test'
8292669@qq.com
#以上2个也相同,将test.sh内容发送到指定邮箱。
[chengmo@centos5 shell]$ (
sed
-n
'1,$p'
|
grep
-n
'echo'
)<
test
.sh
5:
echo
"very good!"
;
7:
echo
"good!"
;
9:
echo
"pass!"
;
11:
echo
"no pass!"
;
#这个脚本比较有意思了。由于前面是管道,后面需要把test.sh内容重定向到 sed ,然后sed输出通过管道,输入给grep.需要将前面用"()"运算符括起来。在单括号内的命令,可以把它们看作一个象一个命令样。如果不加括号test.sh就是grep 的输入了。
#上面一个等同于这个
[chengmo@centos5 shell]$
sed
-n
'1,$p'
<
test
.sh |
grep
-n
'echo'
5:
echo
"very good!"
;
7:
echo
"good!"
;
9:
echo
"pass!"
;
11:
echo
"no pass!"
;
#重定向运算符,在shell命令解析前,首先检查的(一个命令,执行前一定检查好它的输入,输出,也就是0,1,2 设备是否准备好),所以优先级会最高
[chengmo@centos5 shell]$
sed
-n
'1,10p'
<
test
.sh |
grep
-n
'echo'
<testsh.sh
10:
echo
$total;
18:
echo
$total;
21:
echo
"ok"
;
#哈哈,这个grep又接受管道输入,又有testsh.sh输入,那是不是2个都接收呢。刚才说了"<"运算符会优先,管道还没有发送数据前,grep绑定了testsh.sh输入,这样sed命令输出就被抛弃了。这里一定要小心使用
#输出重定向
[chengmo@centos5 shell]$
cat
test
.sh>
test
.txt
[chengmo@centos5 shell]
cat
test
.sh|
tee
test
.txt &>
/dev/null
#通过管道实现将结果存入文件,还需要借助命令tee,它会把管道过来标准输入写入文件test.txt ,然后将标准输入复制到标准输出(stdout),所以重定向到/dev/null 不显示输出
#">"输出重定向,往往在命令最右边,接收左边命令的,输出结果,重定向到指定文件。也可以用到命令中间。
[chengmo@centos5 shell]$
ls
test
.sh test1.sh testsh.sh 2>err.txt |
grep
'test'
test
.sh
testsh.sh
#目录下面有:test,testsh文件,test1.sh不存在,因此将ls 命令错误输出输入到err.txt 正确输出,还会通过管道发送到grep命令。
[chengmo@centos5 shell]$
ls
test
.sh test1.sh testsh.sh &>err.txt |
grep
'test'
#这次打印结果是空,&代表正确与错误输出 都输入给err.txt,通过管道继续往下面传递数据为空,所以没有什么显示的
#同样">"输出重定向符,优先级也是先解析,当一个命令有这个字符,它就会与左边命令标准输出绑定。准备好了这些,就等待命令执行输出数据,它就开始接收