第11章 重定向和文件的查找
第12章 磁盘介绍及管理
第13章 Linux文件系统结构
第14章 RAID的原理与搭建
第15章 LVM管理和SSM工具使用
Linux运维实战:CentOS7.6操作系统从入门到精通(11-15)
第11章 重定向和文件的查找
Linux下一切皆文件,包括所有的程序和一些设备的访问入口都展示为文件。
Linux中的文件分为普通文件、目录文件、链接文件和设备文件四种类型。
11.1 文件描述符
文件描述符是内核为了高效管理已被打开的文件所创建的索引,用于指向被打开的文件,所有执行I/O操作的系统调用都通过文件描述符;文件描述符是一个简单的非负整数,用以标明每一个被进程所打开的文件,程序刚刚启动的时候,第一个打开的设备文件是0,第二个是1,依此类推。也可以理解为是文件的身份ID。
用户通过操作系统处理信息的过程中,使用的交互设备文件(键盘,鼠标,显示器)如图所示。
1.标准输入输出说明,如图11-2所示
图11-2 标准输入、输出
- STDIN标准输入,默认的设备是键盘,文件编号为0。
- STDOUT标准输出,默认的设备是显示器,文件编号为1,也可以重定向到文件。
- STDERR标准错误输出,默认的设备是显示器,文件编号为2,也可以重定向到文件。
2.查看一个进程打开了哪些文件
语法:ll /proc/PID/fd
, 该文件下专门存文件描述符。
[root@utahstu2 utah]# ps -ef | grep vim
root 34007 2994 0 11月01 pts/0 00:00:00 vim test.txt
root 78577 2994 0 19:11 pts/0 00:00:00 grep --color=auto vim
[root@utahstu2 utah]# ll /proc/34007/fd #查看vim进程打开的文件
总用量 0
lrwx------. 1 root root 64 11月 3 19:12 0 -> /dev/pts/0
lrwx------. 1 root root 64 11月 3 19:12 1 -> /dev/pts/0
lrwx------. 1 root root 64 11月 3 19:11 2 -> /dev/pts/0
lrwx------. 1 root root 64 11月 3 19:12 4 -> /home/utah/utah/.test.txt.swp
这些0、1、2、4就是文件的描述符。一个进程启动时,都会打开3个文件:标准输入、标准输出和标准错误输出。这3个文件分别对应的文件描述符为0、1和2,也就是宏替换STDIN_FILENO
、STDOUT_FILENO
和STDERR_FILENO
。
⚠️注意:对文件描述符的操作就是对文件本身的操作,可以直接通过操作文件描述符来修改文件。
例11.2:查看和临时设置一个进程最多可以打开几个文件,也就是说,一个进程可以打开的文件描述符的个数限制。
[utah@utahstu2 ~]$ ulimit -n #查看一个进程最多可以同时打开的文件数1024
[utah@utahstu2 ~]$ ulimit -n 2048 #修改一个进程最多可以同时打开的文件数2048.
[utah@utahstu2 ~]$ ulimit -n
2048
11.2 重定向的含义及管道、tee命令的使用
11.2.1 输入重定向
定义:输入重定向主要更改程序的数据输入方式。
11.2.1 输入重定向更改程序的数据输入方式。
11.2.2 输出重定向
定义:输出重定向是指将命令的正常输出结果保存到指定的文件中,而不是直接显示在显示器的屏幕上。输出重定向使用“>”“>>”操作符号。
语法:
> 文件名
,表示将标准输出的内容,写到后面的文件中,如果此文件名已经存在,将会覆盖原文件中的内容,若此文件不存在,则会以此文件名写新建文件。
>> 文件名
,表示将标准输出的内容,以追加形式写到后面的文件中。若此文件不存在,则会以此文件名新建该文件。
Eg. 查看当前主机的CPU的类型并保存到cpu.txt文件中(而不是直接显示到屏幕上)。
[utah@utahstu2 utah]$ cat /proc/cpuinfo > cpuinfo.txt
Eg. 清空一个文件
[utah@utahstu2 utah]$ > test.txt
11.2.3 EOF的使用
EOF本意是End Of File,表明到了文件末尾。“EOF”通常与“<<”结合使用,“<<EOF”表示后续的输入作为子命令或者子Shell的输入,直到命令又遇到“EOF”,再次返回到主调Shell,可将其理解为分界符(delimiter)。既然是分界符,那么形式自然不是固定的,这里可以将“EOF”进行自定义,但是前后的分界符必须成对出现且不能和Shell命令冲突。
例11.8:以<<EOF开始,以EOF结尾。
[utah@utahstu2 utah]$ cat > test.txt <<EOF
> qwer
> asdf
> EOF
[utah@utahstu2 utah]$ cat test.txt
qwer
asdf
例11.9:以ccc作为分界符(自定义一个结束符)。
[utah@utahstu2 utah]$ cat >test.txt <<ccc
> qwe
> sdf
> ccc
[utah@utahstu2 utah]$ cat test.txt
qwe
sdf
例11.10:在脚本中可以通过输入重定向来打印消息菜单。在使用的时候需要在“<<
”右边跟一对终止符。终止符是可以自定义的。
11.2.4 错误重定向
定义:将命令执行过程中出现的错误信息(选项或参数错误)保存到指定的文件中,而不是直接显示到显示器。
重定向操作符:
-
输入重定向:0<或简写为<。
-
输出重定向:1>或简写为>。
-
错误重定向:2>。
其中的2指的是标准错误输出的文件描述符(在使用标准输入和输出时省略了1、0编号)。
在实际应用中,错误重定向可以用来收集执行的错误信息,为排错提供依据。对于Shell脚本还可以将无关紧要的错误信息重定向到空文件/dev/null
中,以保持脚本输出的简洁。
例11.11:将错误显示的内容和正确显示的内容分开。
[utah@utahstu2 utah]$ ls /etc/passwd xxx #没有重定向时的正常显示
ls: 无法访问xxx: 没有那个文件或目录
/etc/passwd
[utah@utahstu2 utah]$ ls /etc/passwd xxx > a.txt #用>重定向正确的输出,不重定向错误输出。所以显示错误
ls: 无法访问xxx: 没有那个文件或目录
[utah@utahstu2 utah]$ cat a.txt #查看正确输出重定向到a.txt中的内容,没有错误信息。
/etc/passwd
[utah@utahstu2 utah]$ ls /etc/passwd xxx 2> a.txt #用2>重定向错误的输出,不重定向正确输出
/etc/passwd
[utah@utahstu2 utah]$ cat a.txt #查看错误信息被重定向到a.txt中,且覆盖之前的内容。
ls: 无法访问xxx: 没有那个文件或目录
[utah@utahstu2 utah]$
注意:使用“2>”操作符时,像使用“>”操作符时一样,会覆盖目标文件的内容,若要追加而不覆盖文件的内容可使用“2>>”操作符。
11.2.5 null黑洞和zero空文件
1.可以把/dev/null
文件看作“黑洞”(是个特殊设备),所有写入的内容都会永远丢失,而尝试读取内容则什么也读不到,然而/dev/null
文件对命令行和脚本都非常有用。
[utah@utahstu2 utah]$ echo aaa > /dev/null
[utah@utahstu2 utah]$ cat /dev/null #读取不到任何信息
2./dev/zero
,在类UNIX操作系统中是一个特殊的设备文件,读取该文件的时候,它会提供无限的空字符(NULL,ASCII NUL,0x00)。典型用法是用它来产生一个特定大小的空白文件。
例11.12:使用dd命令产生一个50MB的空白文件。
dd命令:用于转换并复制一个文件。
参数如下。
(1)
if
代表输入文件。如果不指定if,默认就会从stdin中读取输入。
(2)of
代表输出文件。如果不指定of,默认就会将stdout作为默认输出。
(3)bs
代表以字节为单位的块大小。
(4)count
代表被复制的块数。
[utah@utahstu2 utah]$ dd if=/dev/zero of=a.txt bs=1M count=50 #产生一个50M文件
记录了50+0 的读入
记录了50+0 的写出
52428800字节(52 MB)已复制,1.12023 秒,46.8 MB/秒
[utah@utahstu2 utah]$ du -sh a.txt #使用du命令查看a.txt文件的内容,大小为50M
50M a.txt
[utah@utahstu2 utah]$ cat a.txt #使用cat命令查看,没有内容显示。
11.2.6 &> 和 >& 符号
&表示等同于的意思。
>& 将一个句柄的输出写入到另一个句柄的输入中
<& 从一个句柄读取输入并将其写入到另一个句柄输出中
- 2>&1:将标准错误重定向到标准输