标准输入、标准输出和标准错误
标准输入(通道0)从键盘读取输入
标准输出(通道1)将正常输出发送到终端
标准错误(通道2)将错误消息发送到终端
进程I/O通道(文件描述符)
通道(文件描述符)
编号 | 通道名称 | 描述 | 默认链接 | 用法 |
0 | stdin | 标准输入 | 键盘 | 仅读取 |
1 | stdout | 标准输出 | 终端 | 仅写入 |
2 | stderr | 标准错误 | 终端 | 仅写入 |
3+ | filename | 其他文件 | 无 | 读取和/或写入 |
输出重定向操作符
输出重定向示例
保存时间戳以供日后参考 [jumpserver@192 ~]$ date > /tmp/saved-timestamp [jumpserver@192 ~]$ cat /tmp/saved-timestamp Mon Nov 16 23:46:36 PST 2020 将一个日志文件的最后100行复制到另一个文件 [jumpserver@192 ~]$ sudo tail -n 100 /var/log/messages > /tmp/last-100 将四个文件连成一个 [jumpserver@192 test]$ cat file1 file3 file5 file6 > /tmp/four 将输出附加到现有文件 [jumpserver@192 test]$ echo "haha" >> ./file1 [jumpserver@192 test]$ cat file1 1 haha 将错误重定向到文件 [jumpserver@192 test]$ find /etc -name passwd 2> /tmp/errors /etc/pam.d/passwd /etc/passwd [jumpserver@192 test]$ cat /tmp/errors find: ‘/etc/pki/rsyslog’: Permission denied find: ‘/etc/lvm/archive’: Permission denied 将进程输出和错误消息保存到单独文件中 [jumpserver@192 test]$ find /etc -name passwd >/tmp/ouput 2>/tmp/errors2 [jumpserver@192 test]$ cat /tmp/ouput /etc/pam.d/passwd /etc/passwd [jumpserver@192 test]$ cat /tmp/errors2 find: ‘/etc/pki/rsyslog’: Permission denied find: ‘/etc/lvm/archive’: Permission denied 忽略并丢弃错误信息 [jumpserver@192 test]$ find /etc -name passwd >/tmp/ouput 2>/dev/null 将输出和生成的错误消息存储在一起 [jumpserver@192 test]$ find /etc -name passwd &> /tmp/saveboth [jumpserver@192 test]$ cat /tmp/saveboth find: ‘/etc/pki/rsyslog’: Permission denied find: ‘/etc/lvm/archive’: Permission denied find: ‘/etc/lvm/backup’: Permission denied find: ‘/etc/lvm/cache’: Permission denied find: ‘/etc/dhcp’: Permission denied find: ‘/etc/cups/ssl’: Permission denied /etc/pam.d/passwd /etc/passwd 将输出和生产城的错误附加到现有文件 [jumpserver@192 test]$ find /etc -name passwd >> /tmp/saveboth 2>&1
构建管道
管道是一个或多个命令的序列,用竖线(|)分隔。管道将第一个命令的标准输出链接到下一个命令的标准输入
管道示例
ls命令输出并使用less在终端上以一次一屏的方式显示输出 [jumpserver@192 test]$ ls -l /usr/bin | less head将ls -t 内容输出内容前十行,并且最终结果重定向到一个文件 [jumpserver@192 test]$ ls -t | head -n 10 > /tmp/ten
管道、重定向和tee命令
当重定向与管道组合时,shell会首先设置整个管道符,然后重定向输入/输出。如果在管道的中间使用了重定向,则输出将转至文件,而不是前往管道中的下一个命令
[jumpserver@192 test]$ ls > /tmp/save | less 空白
tee命令克服了这个限制。在管道中,tee将其标准输入复制到其标准输出中,并且还将标准输出重定向到指定为命令参数的文件
示例
[jumpserver@192 test]$ ls |tee /tmp/save | less file1 file3 file5 file6 rhel6 rhel7 rhel8 [jumpserver@192 test]$ ls | head -n 10 | tee /tmp/ten [jumpserver@192 test]$ ls | head -n 10 | tee /tmp/ten file1 file3 file5 file6 rhel6 rhel7 rhel8
注意:可通过管道来重定向标准错误,但是不能使用合并重定向运算符(&>和&>>)执行此操作
以下是通过管道来重定向标准输出和标准错误的正确方法
[jumpserver@192 test]$ find -name /passwd 2>&1 | less