1、每个文件打开后都有一个fd:file descriptor(文件描述符)
而查看文件描述符的方法如下
ll /proc/$$/fd
删除方法,不能使用rm删除,会提示错误;
exec 8>&-
0标准输入设备;
1正确输出信息
2错误输出信息
ls /data > ls.log 正常输出覆盖文件
ls /data >> ls.log 正常输出追加文件
ls /data/error 2> ls.log 因为error文件不存在,所以输出错误信息,错误信息被输出到ls.log中;
ls /data /data/error >ls_right.log 2>ls_error.log 正确文件处处到第一个log,错误信息输出到第二个log
ls /error /data >all.log 2>&1 将正确和错误信息都放入到all.log中
在上图中,本来的执行顺序是先将正确结果输出到all.log中,然后再将错误的信息输出到1中,但是1默认是屏幕输出,所以就显示到屏幕上了;
加上括号后,就先执行括号内的命令,然后再将正确信息输出到屏幕上;
可以看出重定向是先执行最后面的重定向,然后再执行前面的重定向;
其中一个应用
bigfile就是可以清空大文件字节;
f1也可以用来创建空文件,比touch的好处是,如果文件存在,并不会覆盖,并且不会修改已存在文件的属性信息;
all.log_link对软链接进行空定向,会删除软链接所指向的原始文件;
/dev/sda1这种情况并不会清空boot的分区;
cat有标准输入也可以标准输出;
cat </etc/hosts
就可以将host输出到屏幕;
cat f1 相当于把f1破坏成了0
cat >f1相当于不断追加信息把f1文件无限扩大下去;
重定向执行顺序
shell会按照;等分隔符将一串命令分成多个命令,替换命令中的变量后执行单条命令
shell单条命令,重定向部分的执行顺序:先<,然后command,最后<和<<
第一步:先读取<后的内容做为输入,如果一条命令有多个<,会读取最后一个<后的内容
<放在命令前后都可以,例如【< /etc/hosts cat】相当于【cat /etc/hosts】
第二步:执行command命令
第三步:如果有>或>>会将结果进行重定向,如果输出重定向多个文件,只会将内容重定向到最后一个文件
例如 cat /etc/hosts > test1.txt >test2.txt
只有test2.txt会出现内容,test1.txt内容是空的
输出重定向>和>>的位置放在哪里都可以,例如【> test.txt cat /etc/hosts】,表示将/etc/hosts的内容输入到test.txt中
2、tr命令;
用法
tr ‘a-z’ ‘A-Z’ 将屏幕上输入的字符小写字母转换为大写字母;
tr ‘a-z’ ‘A-Z’ < file1 >file2 将文件file1中的小写转换为大写,然后输出到file2中;
tr -t ‘abc’ ‘1234’
tr -d ‘abc’ 把abc对应的字符删掉;
tr -dc ‘abc’ 把abc之外的字符都删除,就是保留abc的意思,在屏幕上输出的时候需要使用ctrl+d命令刷新;
tr -s ‘abc’ 对输入的连续字符进行压缩;
hexdump -C linux.txt
hexdump -C win2.txt 两个文件进行16进制比较;
经过bc转换后,算出0d对应的8进制是15;
tr -d ‘\15’ < win.txt > win2.txt 删除回车
tr -d ‘\r’ <win.txt > win3.txt删除回车
tr ‘\n’ ‘\t’ <linux.txt 换行替换成tab
tr ‘\n’ ‘\v’ <linux.txt 换行替换成竖列tab键
tr -s ’ ’ <win3.txt 将文件内多余空格进行压缩;
tr -s ’ ’ <df.log 对df显示的内容的空格进行压缩;
tr -s ’ ’ ‘:’ <df.log对df显示的内容的空格进行压缩并替换;
cat >file
当敲下cat的时候,file内的内容已经被清空,这时候在屏幕下方敲如abc,在不回车的情况下,file内依然是空,敲下回车后,file内的内容已经有了abc的内容,敲下回车的时候说明已经写入;
上面这种敲下回车,输入一下,叫做单行重定向,但我们需要多行输入的话,就需要多行重定向,这时候需要有一个起止符;(终止字符前后不能有空格)
发邮件时,单行重定向需要用.来进行结束;
cat输入结束的快捷键是ctrl+d;
2、管道符
管道前面必须是标准输出,如果输出的是错误,后面将不执行;
seq -s + 100 |bc也可以实现1加到100的和;
tee命令是将文件既在终端显示,也输入到文件当中;
操作系统版本命令
lsb_release -a显示的是操作系统版本;
uname -r显示的内核版本;
管道符左边必须标准输出,右边必须是标准输出;
标准输入的命令并不多,比如cat tr bc 像echo这种就只有标准输出,没有标准输入;
openssl rand -base64 12随机生成个字符;
touch ·openssl rand -base64 10 |tr -dc ‘[:alnum:]’ |tr ‘[:uper:]’ ‘[:lower:]’ ·创建文件名为随机的字母和数字的文件;
1、tr ‘[:lower:]’ ‘[:upper:]’ </etc/issue >/tmp/issue.out
2、who | tr ‘[:lower:]’ ‘[:upper:]’ >/tmp/who.out