以cat为例,功能是从文件读数据,送到stdout。
# cat tmp
back-loop.sh
cgiselect
要是没有文件作为命令的参数,那么就要从stdin输入,实际上就是将界面输入的字符串都打印出来。
# cat
hello
hello
world
world
用户每输入一行都会打印出来,Ctrl+d表示终止输入。
再感受一个例子。
# sort
a
c
b
输入结束:Ctrl+d
a
b
c
2、输入重定向
command-line [n]
将然有,命令默认从键盘获得的输入,改成从文件,或者其它打开文件以及设备输入。执行这个命令,将标准输入0,与文件或设备绑定。将由它进行输入。
详细出处参考:http://www.jb51.net/LINUXjishu/32566.html
[chengmo@centos5 shell]# cat > catfile
testing
cat file test
#这里按下 [ctrl]+d 离开
#从标准输入【键盘】获得数据,然后输出给catfile文件
[chengmo@centos5 shell]$ cat>catfile
#cat 从test.sh 获得输入数据,然后输出给文件catfile
[chengmo@centos5 shell]$ cat>catfile
<
test a file
test!
eof
#<<
这个连续两个小符号,他代表的是『结束的输入字符』的意思。这样当空行输入eof字符,输入自动结束,不用ctrl+D
再看一例:
$ wc /etc/passwd
20 23 726 /etc/passwd
$ wc < /etc/passwd
20 23 726
3、输出重定向
command-line1 [1-n] > file或文件操作符或设备
上面命令意思是:将一条命令执行结果(标准输出,或者错误输出,本来都要打印到屏幕上面的)重定向其它输出设备(文件,打开文件操作符,或打印机等等)1,2分别是标准输出,错误输出。
[chengmo@centos5 shell]$ ls test.sh test1.sh #不重定向,结果直接输出到屏幕
ls: test1.sh: 没有这个文件和目录
test.sh
[chengmo@centos5 shell]$ ls test.sh test1.sh
1>suc.txt #将stdout写入suc.txt,1可以省略,直接>suc.txt,默认是1.
ls: test1.sh: 没有这个文件和目录
[chengmo@centos5 shell]$ cat suc.txt
test.sh
[chengmo@centos5 shell]$ ls test.sh test1.sh
1>suc.txt 2>err.txt
#将stdout写入suc.txt,stderr写入err.txt
[chengmo@centos5 shell]$ cat suc.txt err.txt
test.sh
ls: test1.sh: 没有这个文件和目录
[chengmo@centos5 shell]$ ls test.sh test1.sh
1>>suc.txt
2>>err.txt #>>是追加,不是从开头写入
[chengmo@centos5 shell]$ ls test.sh test1.sh
2>&- #关闭stderr
test.sh
[chengmo@centos5 shell]$ ls test.sh test1.sh
2>/dev/null #写入空设备,相当于关闭
test.sh
#&[n] 代表是已经存在的文件描述符,&1 代表输出
&2代表错误输出 &-代表关闭与它绑定的描述符
#/dev/null 这个设备,是linux 中黑洞设备,什么信息只要输出给这个设备,都会给吃掉。你也可以cat /dev/null
>tmp表示清空tmp文件。
[chengmo@centos5 shell]$ ls test.sh test1.sh
>/dev/null 2>&1
#将错误输出2
绑定给正确输出 1,然后将 正确输出 发送给 /dev/null设备 这种常用
[chengmo@centos5 shell]$ ls test.sh test1.sh
&>/dev/null #&
代表标准输出,错误输出将所有标准输出与错误输出 输入到/dev/null文件
注意:
1、shell遇到”>”操作符,会判断右边文件是否存在,如果存在就先删除,并且创建新文件。不存在直接创建。无论左边命令执行是否成功。右边文件都会变为空。
2、“>>”操作符,判断右边文件,如果不存在,先创建。以添加方式打开文件,会分配一个文件描述符[不特别指定,默认为1,2]然后,与左边的标准输出(1)或错误输出(2)绑定。
3、当命令:执行完,绑定文件的描述符也自动失效。0,1,2又会空闲。
4、一条命令启动,命令的输入,正确输出,错误输出,默认分别绑定0,1,2文件描述符。
5、一条命令在执行前,先会检查输出是否正确,如果输出设备错误,将不会进行命令执行
4、管道
管道用于将一个程序的输出作为另一个程序的输入。管道特别适用将多个命令连接起来。
比如:
# ls . | wc -w ------------------统计本地文件夹的文件个数
9
# cat tmp | grep sh | wc -l -------------------打开文件tmp,查找单词sh,统计文件中有"sh"的行的数量
3
5、替换
命令替换是将一个命令行的输出作为另一个命令的参数。
command1 `command2`
其中,command2的输出将作为command1的参数。需要注意的是这里的`符号,被它括起来的内容将作为命令执行,执行后的结果作为command1的参数。
$ cd `pwd`
该命令将pwd命令列出的目录作为cd命令的参数,结果仍然是停留在当前目录下,等同于pwd |
cd。但是如果一个命令不止一个参数,那么用替换有时就比较方便了。
6、减号 -
当一些指令需要使用文件名称操作时(比如tar),可以用减号-来表示stdin或者stdout。注意不要与cd -混淆了,cd
-表示回到上一个目录。
比如: tar cvf - /source/directory | (cd
/dest/directory && tar xvf - )
-------------------------可以实现快速的拷贝文件目录
7、xargs
xargs是个很好用的工具,可以将stdin分割为参数,赋给要调用的指令。注意,xargs是以空格或者断行字符来分割stdin的,所以如果你的输入中有空格,可能会有问题,需要做一些处理。
xargs有两个非常大的用处:
(1)对于那些不支持管道的命令(比如ls,echo),但又需要配合管道操作时,只能用xargs来调用;
(2)xargs可以对入参进行处理,很方便的传给命令。
举例说明:
# find /sbin -perm /7000 |ls -l #只显示本地目录,因为ls不支持管道
# find /sbin -perm /7000 |xargs ls -l #可以实现目的,查看/sbin中特殊权限文档的详细信息
# cut -d':' -f1 /etc/passwd |head -n 3 #取出文件中第一栏,并且只取前三行
root
bin
daemon
# cut -d':' -f1 /etc/passwd |head -n 3 | finger #只显示当前用户的信息
# cut -d':' -f1 /etc/passwd |head -n 3 | xargs finger
#显示取出的用户的信息
# cut -d':' -f1 /etc/passwd |head -n 3 | xargs -p finger
#-p参数会询问是否继续操作
finger root bin daemon ?...y
# cut -d':' -f1 /etc/passwd |head -n 3 | xargs -p -n 1 finger
#-n参数限制参数数量,将参数分为多个部分,每次最多输入n个
# cut -d':' -f1 /etc/passwd |head -n 3 | xargs -e'bin' finger
#-e参数,eof,当遇到指定字符串时终止入参输入
# find . -type f -print0 | sed 's/\.rpm//g ; s/\.\///g' |
xargs -0 rpm -e
#man find和xargs可以看到类似这个命令的例子,find
-print0打印文件名并在文件名后加一个空字符(非断行),而xargs -0则以空字符来分割参数。这两个命令是很般配的。