2. 输入输出重定向

标准输入重定向 是指用一个文件的内容代替键盘输入。

输出重定向 是指将 标准输出标准错误输出 输出到文件来代替打印到屏幕上。

标准输入重定向

语法格式

命令 ... < 文件路径

... 代表选项和参数。

示例:

head -2 命令默认是将键盘输入的内容的前两行打印到屏幕上,当输入文件结束符(Control + d)时表示输入完成。如:

weimingze@mzstudio:~$ tail -2
this is first line.  # 这一行是键盘输入
this is second line. # 这一行是键盘输入
this is third line.  # 这一行是键盘输入,回车后输人 `Control + d`
this is second line.  # 这两行是打印输如的内容 
this is third line.

使用文件 /etc/passwd 作为键盘输入。

weimingze@mzstudio:~$ tail -2 < /etc/passwd
weimingze:x:1000:1000:weimingze:/home/weimingze:/bin/bash
sshd:x:122:65534::/run/sshd:/usr/sbin/nologin

用法:当有程序需要复杂的输入时,可以将这些输入内容按格式写入文件中,然后再使用输入重定向来代替键盘输入以节省时间。

标准输出重定向

语法格式

命令 ... > 文件路径
# 或
命令 ... >> 文件路径

标准错误输出重定向

语法格式

命令 ... 2> 文件路径
# 或
命令 ... 2>> 文件路径

重定向操作符

操作符
说明
< 文件路径
标准输入重定向,用指定文件内容代替输入。
> 文件路径
标准输出重定向,将输出重定向到指定文件(清空原有内容)。
>> 文件路径
标准输出重定向,将输出重定向到指定文件(追加新内容)。
2> 文件路径
标准错误输出重定向,将输出重定向到指定文件(清空原有内容)。
2>> 文件路径
标准错误输出重定向,将输出重定向到指定文件(追加新内容)。
&> 文件路径
将标准输出与错误输出的内容全部重定向到指定文件。

示例

greptail -2 命令的输出重定向到文件 result.txt

weimingze@mzstudio:~$ grep "root" /etc/passwd > result.txt
weimingze@mzstudio:~$ cat result.txt
root:x:0:0:root:/root:/bin/bash
nm-openvpn:x:121:122:NetworkManager OpenVPN,,,:/var/lib/openvpn/chroot:/usr/sbin/nologin
weimingze@mzstudio:~$ grep "root" /etc/passwd > result.txt
weimingze@mzstudio:~$ cat result.txt
root:x:0:0:root:/root:/bin/bash
nm-openvpn:x:121:122:NetworkManager OpenVPN,,,:/var/lib/openvpn/chroot:/usr/sbin/nologin
weimingze@mzstudio:~$ tail -2 /etc/group >> result.txt
weimingze@mzstudio:~$ cat result.txt
root:x:0:0:root:/root:/bin/bash
nm-openvpn:x:121:122:NetworkManager OpenVPN,,,:/var/lib/openvpn/chroot:/usr/sbin/nologin
gnome-initial-setup:x:985:
weimingze:x:1000:

find /etc/ -name "passwd" 命令的标准输出重定向到文件 find.txt, 将标准错误输出重定向到文件 error.txt

weimingze@mzstudio:~$ find /etc/ -name "passwd"
/etc/pam.d/passwd
find: ‘/etc/sssd’: Permission denied
find: ‘/etc/polkit-1/rules.d’: Permission denied
find: ‘/etc/credstore’: Permission denied
find: ‘/etc/vmware-tools/GuestProxyData/trusted’: Permission denied
/etc/passwd
find: ‘/etc/cups/ssl’: Permission denied
find: ‘/etc/ssl/private’: Permission denied
find: ‘/etc/credstore.encrypted’: Permission denied
weimingze@mzstudio:~$ find /etc/ -name "passwd" > find.txt 2> error.txt
weimingze@mzstudio:~$ cat find.txt
/etc/pam.d/passwd
/etc/passwd
weimingze@mzstudio:~$ cat error.txt
find: ‘/etc/sssd’: Permission denied
find: ‘/etc/polkit-1/rules.d’: Permission denied
find: ‘/etc/credstore’: Permission denied
find: ‘/etc/vmware-tools/GuestProxyData/trusted’: Permission denied
find: ‘/etc/cups/ssl’: Permission denied
find: ‘/etc/ssl/private’: Permission denied
find: ‘/etc/credstore.encrypted’: Permission denied

可见标准输出只有如下两行(即正确结果):

/etc/pam.d/passwd
/etc/passwd

find /etc/ -name "passwd" 命令的标准输出和标准错误输入重定向到一个文件 all.txt

weimingze@mzstudio:~$ find /etc/ -name "passwd" &> all.txt
weimingze@mzstudio:~$ cat all.txt
/etc/pam.d/passwd
find: ‘/etc/sssd’: Permission denied
find: ‘/etc/polkit-1/rules.d’: Permission denied
find: ‘/etc/credstore’: Permission denied
find: ‘/etc/vmware-tools/GuestProxyData/trusted’: Permission denied
/etc/passwd
find: ‘/etc/cups/ssl’: Permission denied
find: ‘/etc/ssl/private’: Permission denied
find: ‘/etc/credstore.encrypted’: Permission denied
weimingze@mzstudio:~$

/dev/null 文件

/dev/null 文件是一个特殊的字符设备文件。通常被称为 空设备黑洞 文件。向此文件写入的所有数据会被丢弃(不会占用存储空间),从此文件读取数据会立即提示文件结束并返回。

如:

创建 1.txt 或清空 文件的内容:

weimingze@mzstudio:~$ cat /dev/null > null.txt
weimingze@mzstudio:~$ cat null.txt
weimingze@mzstudio:~$

find /etc/ -name "passwd" 命令的标准输出重定向到文件 find.txt, 将标准错误输出丢弃。

weimingze@mzstudio:~$ find /etc/ -name "passwd" > find.txt 2> /dev/null
weimingze@mzstudio:~$ cat find.txt
/etc/pam.d/passwd
/etc/passwd

特殊的字符设备文件

设备文件
说明
/dev/null
丢弃所有数据,读取返回空。
/dev/zero
读取时返回无限的零字节(\x00)。
/dev/random
读取时返回随机数的字节(阻塞式)。

特殊输出重定向

操作符
说明
>&2
标准输出 重定向为 标准错误输出,如:echo "error!" >&2
2>&1
标准错误输出 重定向到 标准输出,如:mkdir /weimingze 2>&1

练习: