重定向


重定向

  • 文件描述符

    • 输入输出标准说明
  • 重定向

    • 输出重定向
    • 输入重定向
    • EOF
    • 错误重定向
    • null黑洞和zero空文件
    • &>和>&符号
    • 管道的使用
    • tee命令

Linux下一切皆文件;文件又可分为:普通文件、目录文件、链接文件、设备文件;Linux系统使用文件来描述各种硬件设备资源,如:/dev/sda /dev/sdb /dev/sr0

文件描述符

文件描述符:是内核为了高效管理已被打开的文件所创建的索引,用于指向被打开的文件,所有执行I/O操作的系统调用都通过文件描述符;
文件描述符是一个简单的非负整数,用以标明每一个被进程所打开的文件,程序刚刚启动的时候,第一个打开的文件是0,第二个是1,依此类推。 也可以理解为是一个文件的身份ID

用户通过操作系统处理信息的过程中,使用的交互设备文件(键盘,鼠标,显示器)

输入输出标准说明

  • STDIN 标准输入 默认的设备是键盘 文件编号为:0
  • STDOUT 标准输出 默认的设备是显示器 文件编号为:1 ,也可以重定向到文件
  • STDERR 标准错误 默认的设备是显示器 文件编号为:2 ,也可以重定向到文件

如何查看一个进程打开了哪些文件?

语法: ll /proc/进程ID/fd

例:

[root@love ~]# vim /etc/passwd
[root@love ~]# ps -axu | grep passwd
root 4602 2.1 0.2 151600 5300 pts/2 S+ 15:30 0:00 vim /etc/passwd
[root@love ~]# ll /proc/4602/fd #查看打开的文件
总用量 0
lrwx------ 1 root root 64 5月 14 15:30 0 -> /dev/pts/2
lrwx------ 1 root root 64 5月 14 15:30 1 -> /dev/pts/2
lrwx------ 1 root root 64 5月 14 15:30 2 -> /dev/pts/2
lrwx------ 1 root root 64 5月 14 15:30 4 -> /etc/.passwd.swp
# 注: 这些0,1,2,4就是文件的描述符。一个进程启动时,都会打开 3 个文件:标准输入、标准输出和标准出错处理。这3 个文件分别对应文件描述符为 0、1和2也就是宏替换 STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO。
# /proc/进程ID/fd 这个fd目录下,专门存文件描述符

对文件描述符的操作就是对文件本身的操作。 我可以直接通过操作文件描述来修改文件。

查看和临时设置一个进程最多可以打开几个文件,即:一个进程可以打开的文件描述符限制

[root@love ~]# ulimit -n # 查看一个进程最多可以同时打开的文件数
1024
[root@love ~]# ulimit -n 2048 # 临时修改一个进程最多可以同时打开的文件数为2048
[root@love ~]# ulimit -n
2048

重定向

输出重定向

定义:将命令的正常输出结果保存到指定的文件中,而不是直接显示在显示器的屏幕上。重定向输出使用”>” “>>” 操作符号

> 文件名:表示将标准输出的内容,写到后面的文件中,如果此文件名已经存在,将会覆盖原文件中的内容
>> 文件名:表示将标准输出的内容,追加到后面的文件中。若重定向的输出的文件不存在,则会新建该文件

例:

[root@love ~]# cat /proc/cpuinfo > cpu.txt # 查看当前主机的CPU的类型保存到cpu.txt文件中
[root@love ~]# uname -a >> cpu.txt # 将内核的版本信息追加到cpu.txt
[root@love ~]# > cpu.txt # 清空一个文件

输入重定向

grep root /etc/passwd # 将命令中接收输入的途径由默认的键盘改为其他文件.而不是等待从键盘输入
grep root < /etc/passwd

EOF

EOF本意是 End Of File,表明到了文件末尾。”EOF“通常与”<<“结合使用,“<<
EOF“表示后续的输入作为子命令或子shell的输入,直到遇到”EOF“,再次返回到主调shell,可将其理解为分界符(delimiter)。
既然是分界符,那么形式自然不是固定的,这里可以将”EOF“可以进行自定义,但是前后的”EOF“必须成对出现且不能和shell命令冲突。

[root@love ~]# cat > a.txt <<EOF
> dfsd
> sdfs
> sdf
> dfs
> EOF
[root@love ~]# cat a.txt
> dfsd
> sdfs
> sdf
> dfs

在脚本中我们可以通过重定向输入来打印消息菜单

#!/bin/bash

cat <<efo
========================
1.mysql
2.httpd
3.oracle
=======================
efo

错误重定向

将命令执行过程中出现的错误信息 (选项或参数错误) 保存到指定的文件
作用:错误信息保存到文件,在实际应用中,错误重定向可以用来收集执行的错误信息.为排错提供依据;对于shell脚本还可以将无关紧要的错误信息重定向到空文件/dev/null中,以保持脚本输出的简洁

操作符: 错误重定向符号:2> ; 标准输入: 1< 或简写 < ; 标准输出: 0> 或 >

2:指的是标准错误输出的文件描述符 (在使用标准的输入和输出省略了1、0 编号)

将错误显示的内容和正确显示的内容分开

ls /etc/passwd xxx
ls: 无法访问xxx: 没有那个文件或目录
/etc/passwd
ls /etc/passwd xxx > a.txt
ls: 无法访问xxx: 没有那个文件或目录
cat a.txt
/etc/passwd
ls /etc/passwd xxx 2> a.txt
/etc/passwd
cat a.txt
ls: 无法访问xxx: 没有那个文件或目录
# 注:使用 2> 操作符时,会像使用 > 一样覆盖目标文件的内容,若追加而不覆盖文件的内容即可使用 2>> 操作符

null黑洞和zero空文件

  1. 把/dev/null看作"黑洞",所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到. 然而 /dev/null对命令行和脚本都非常的有用.
[root@love ~]# echo aaaa > /dev/null
[root@love ~]# cat /dev/null # 什么信息也看不到
  1. /dev/zero 在类UNIX操作系统中, /dev/zero 是一个特殊的文件,当你读它的时候,它会提供无限的空字符(NULL, ASCII NUL, 0x00)。典型用法是用它来产生一个特定大小的空白文件。
[root@love ~]# dd if=/dev/zero of=b.txt bs=1M count=50
50+0 records in
50+0 records out
52428800 bytes (52 MB) copied, 0.228653 s, 229 MB/s
[root@love ~]# du -sh b.txt
50M b.txt
[root@love ~]# cat b.txt # 什么也不显示
[root@love ~]# ls /tmp xxxx  >ok.txt 2> err.txt # 正确的内容写入一个文件,错误的写入一个文件

&>和>&符号

&表示等同于的意思
例1:把正确和错误的消息输入到相同的位置
1>&2 把标准输出重定向到标准错误
2>&1 把标准错误重定向到标准输出


把正确和错误的消息输入到相同的位置

[root@love ~]# ls /tmp xxxx  >1.txt 2>&1
# 或:
[root@love ~]# ls /tmp xxxx 2>2.txt 1>&2

管道的使用

语法:command-a | command-b | command-c | ......

注意:

  1. 管道命令只处理前一个命令正确输出,不处理错误输出
  2. 管道右边的命令,必须能够接收标准输入的数据流命令才行
  3. 管道符可以把两条命令连起来,它可以链接多个命令使用
[root@love ~]# ps -axu | grep sshd
root 1089 0.0 0.2 105996 4088 ? Ss 20:19 0:00 /usr/sbin/sshd -D
root 43262 0.0 0.0 112680 984 pts/1 S+ 21:36 0:00 grep --color=auto sshd

tee命令

语法:tee -a--version

功能:读取标准输入的数据,并将其内容输出成文件。tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件

[root@love ~]# df -h | tee disk.log # 将磁盘使用的信息写入文件
[root@love ~]# df -h | tee -a disk.log # 将文件系统使用的信息追加到文件

声明:Rock 版权所有,内容均为原创,欢迎转载。

转载:转载请注明原文链接 - 重定向


我是一个程序员,致力于网页开发,我还很年轻,什么也不懂。