Chapter 16 I/O重定向

进程使用文件描述符来管理打开的文件

file descriptors (FD, 文件描述符 或 Process I/O channels)

例如:查看当前bash的fd

[root@Cent-KVM ~]# ls -l /proc/$$/fd
total 0
lrwx------. 1 root root 64 0 -> /dev/pts/0
lrwx------. 1 root root 64 1 -> /dev/pts/0
lrwx------. 1 root root 64 2 -> /dev/pts/0
lrwx------. 1 root root 64 255 -> /dev/pts/0
Number Channel name Default connection Usage
0 stdin Kbd read only
1 stdout Terminal write only
2 stderr Terminal write only
filename read and/or write

进程能打开的文件数是有限的, ulimit -a

16.1 输出重定向

> 覆盖 >> 追加

  • 重定向stdout

    date 1> date.txt (1可省略)

  • 分别重定向

    ls /home /abcdefg >list.txt 2> error.txt

  • 混合重定向

    ls /home /abcdefg &>list1.txt

    ls /home /abcdefg >list2.txt 2>&1(不常用)

  • 丢弃错误输出

    ls /home /abcdefg >list.txt 2>/dev/null

  • 丢弃所有输出

    ls /home /abcdefg &>/dev/null

如果/dev/null被删除,可以这样创建:

mknod -m 666 /dev/null c 1 3

后两位是主设备号(MAJOR)和从设备号(MINOR)

主设备号表示一类设备,可以认为kernel使用相同的驱动

从设备号只是在同类设备中的一个编号

16.2 输入重定向

  • yum -y install mailx

    mail -s "hostname" alice </etc/hostname

    以文件中的内容为正文发送邮件

  • 导入数据库

    mysql -uroot -p123 < bbs.sql

  • 以文件中的命令创建定时任务

    at now + 2 min <at.txt

  • dd

    dd </dev/zero >/file1 bs=1M count=10

    相当于

    dd if=/dev/zero of=/file1 bs=1M count=10

  • 写入文件

    [root@Cent-KVM ~]# cat >file1.txt
    111
    222
    333
    444

    Ctrl+D结束输入

    或者:

    [root@Cent-KVM ~]# cat >file2.txt <<-EOF 
    > 1223
    > 3422
    > 1234
    > EOF

16.3 subshell

写在一对小括号里的命令将在子shell中执行,不会影响当前shell的环境

  • (umask 000; touch file.txt)

16.4 进程管道Piping