释放双眼,带上耳机,听听看~!
输入/输出重定向
大多数 Linux 系统命令从你的终端接受输入并将所产生的输出发送回到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。
重定向命令列表如下:
命令说明
command > file将输出重定向到 file。
command < file将输入重定向到 file。
command >> file将输出以追加的方式重定向到 file。
n > file将文件描述符为 n 的文件重定向到 file。
n >> file将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m将输出文件 m 和 n 合并。
n
<< tag将开始标记 tag 和结束标记 tag 之间的内容作为输入。注意:若file(文件)不存在,则直接创建一个。
文件描述符
当执行shell命令时,会默认打开3个文件,每个文件有对应的文件描述符来方便我们使用:
类型文件描述符默认情况对应文件句柄位置标准输入(standard input)0从键盘获得输入/proc/self/fd/0
标准输出(standard output)1输出到屏幕(即控制台)/proc/self/fd/1
错误输出(error output)2输出到屏幕(即控制台)/proc/self/fd/2
所以我们平时在执行shell命令中,都默认是从键盘获得输入,并且将结果输出到控制台上。但是我们可以通过更改文件描述符默认的指向,从而实现输入输出的重定向。比如我们将1指向文件,那么标准的输出就会输出到文件中。
示例:在我们执行ls a.txt b.txt之后,一共有两种输出,其中ls:无法访问b.txt: 没有那个文件或目录是错误输出,a.txt是标准输出。
我们使用>或者>>对输出进行重定向。符号的左边表示文件描述符,如果没有的话表示1,也就是标准输出,符号的右边可以是一个文件,也可以是一个输出设备。当使用>时,会判断右边的文件存不存在,如果存在的话就先删除,然后创建一个新的文件,不存在的话则直接创建。但是当使用>>进行追加时,则不会删除原来已经存在的文件。
>/dev/null
这条命令的作用是将标准输出1重定向到/dev/null中。 /dev/null代表linux的空设备文件,所有往这个文件里面写入的内容都会丢失,俗称“黑洞”。那么执行了>/dev/null之后,标准输出就会不再存在,没有任何地方能够找到输出的内容。
2>&1
这条命令用到了重定向绑定,采用&可以将两个输出绑定在一起。这条命令的作用是错误输出将和标准输出同用一个文件描述符,说人话就是错误输出将会和标准输出输出到同一个地方。
Linux在执行shell命令之前,就会确定好所有的输入输出位置,并且从左到右依次执行重定向的命令,所以>/dev/null 2>&1的作用就是让标准输出重定向到/dev/null中(丢弃标准输出),然后错误输出由于重用了标准输出的描述符,所以错误输出也被定向到了/dev/null中,错误输出同样也被丢弃了。执行了这条命令之后,该条shell命令将不会输出任何信息到控制台,也不会有任何信息输出到文件中。
常用重定向示例:
将ls a.txt b.txt中的错误输出丢入黑洞:ls a.txt b.txt 2>/dev/null
将cat test1.txt的输出追加到test2.txt: cat test1.txt >> test2.txt(若是cat test1.txt > test2.txt则test2.txt的内容会被test1.txt覆盖)
清空test2.txt的内容:cat /dev/null > test2.txt
将cat test1.txt的标准输入重定向到a.txt,标准输出重定向到test2.txt: cat test1.txt test2.txt
管道符、特殊符号
1、管道符:
linux中管道符“|”的作用
命令格式:命令A|命令B,即命令A的正确输出作为命令B的操作对象例如:
ps aux | grep “test” 在 ps aux中的結果中查找test。
find -name “*.txt” | xargs grep “good” 把find的结果当成参数传入到grep中,即在那些文件内部查找good关键字。
cat *.dat|grep 2018 显示dat文件里的信息,在dat文件里显示条件带有2018的信息。
2、多命令符:
; 多个命令互相不影响,命令之间没有任何逻辑联系
例:touch 11.txt; rm -rf test1.txt(新建11.txt文件,删除test.txt文件)
a && b a命令执行成功才执行b命令,a命令不成功则不执行b
例:touch 11.txt&& rm -rf 11.txt(先建立新文件11.txt,然后删除11.txt)
a || b a成功不执行b a失败才执行b
例:touch 11.txt|| rm -rf test1.txt(如果建立11.txt成功,则不删除test1.txt)
ifconfig && echo “成功” || echo “失败” 可用来判断第一个命令是否成功
3、后台执行: “&”
用户有时候执行命令要花很长时间,可能会影响做其他事情。最好的方法是将它放在后台执行。后台运行的程序在用户注销后系统还可以继续执行。当要把命令放在后台执行时,在命令的后面加上“&”
4、斜线: /
在路径表示中代表目录
cd /data1/conf/
单一的/,代表root根目录
在运算中,代表除法
a=10/2
5、反斜线: \
放在指令前,有取消 aliases的作用;放在特殊符号前,该特殊符号的作用消失,;放在指令的最末端,表示指令连接下一行。
$cat data2
the cost is $4.00
$sed -n ‘/ \ $ /p’data2
the cost is $4.00
6、井号:
#:管理员
$:普通用户
脚本中的:#号是注释
如果被用在指令中,或者引号双引号括住的话,或者在倒斜线的后面,那他就变成一般符号,不具上述的特殊功能。
7、星号: *
常用的符号,在文件名扩展上,用来代表任何字元,包含null字元
例:rm *.txt(删除所有以“.txt”结尾的文件)
rm -rf *a*(删除所有含有字符“a”的文件和目录)
在运算时。它代表“乘法”:let “aa=2*3”
除了内建指令let,还有一个关于运算的指令expr,星号在这里也担任“乘法”的角色。
8、问号: ?
问号表明前面的字符可以出现0次或1次,不包含null字元
ls da?ta
常用快捷键
[tab] 键
在linux所有的shell中,[tab]是最常用的也是linux的bash shell中最棒的功能;它具有命令补全和档案补全的功能。
举例1:命令补全(只需要输入pw,再按两下tab键,就会出现所有可能的命令)
举例2:文件名和目录名补全(只需要输入te,再按两下tab键,就会出现所有可能的文件,如果只有一个符合的,则按一下tab键会直接补全)
Ctrl+c:这个键可不是用来复制的,在中端下,按下Ctrl+C就代表结速当前终端执行的程序,按下的时候一定要慎重。
Ctrl+a:将光标移动到命令行的开始处。 Ctrl+E:将光标移动到命行令的结尾处。
Ctrl+u:删除行首到光标出的字符。
Ctrl+d:退出,相当于logout。
Ctrl+u:剪切,可是说是删除也不为过(Ctrl+y可粘贴回来)。
Ctrl+k:删除光标以后的。
Ctrl+z:把当前进程送到后台处理。
Ctrl+r:搜索历史命令。(输入后显示历史命令)。
Ctrl + l:清除屏幕输出(清屏)。