重定向

  • stdout:标准输出流,文件描述符为1
  • stderr:标准错误流,文件描述符为2
  • stdin:标准输入流,文件描述符0

重定向输出

  • 在输出重定向的描述符中,command>file表示覆盖,command>>file表示追加,如下:
    1
    2
    3
    4
    5
    6
    7
    hyd@DESKTOP-IKHMVJG:~$ echo 123 > demo && cat demo
    123
    hyd@DESKTOP-IKHMVJG:~$ echo 456 > demo && cat demo #覆盖原文件的123
    456
    hyd@DESKTOP-IKHMVJG:~$ echo 456 >> demo && cat demo #在456后追加456
    456
    456
  • 如n>file,n>>file,可使用文件描述符来重定向,同上:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    hyd@DESKTOP-IKHMVJG:~$ touch xaa xab yaa yab
    hyd@DESKTOP-IKHMVJG:~$ ls x* z*
    ls: cannot access 'z*': No such file or directory
    xaa xab
    hyd@DESKTOP-IKHMVJG:~$ ls x* z* >stdout.txt 2>stderr.txt
    hyd@DESKTOP-IKHMVJG:~$ ls w* y*
    ls: cannot access 'w*': No such file or directory
    yaa yab
    hyd@DESKTOP-IKHMVJG:~$ ls w* y* >>stdout.txt 2>>stderr.txt
    hyd@DESKTOP-IKHMVJG:~$ cat stdout.txt
    xaa
    xab
    yaa
    yab
    hyd@DESKTOP-IKHMVJG:~$ cat stderr.txt
    ls: cannot access 'z*': No such file or directory
    ls: cannot access 'w*': No such file or directory
  • 使用n>&m将输出文件m与n合并,如下含义为:将stderr重定向到stdout,再将stdout重定向到output.txt。
    1
    command 2>&1 >output.txt

重定向输入

重定向输入的使用方式与输出类似,使用<提示符:

1
2
3
4
5
hyd@DESKTOP-IKHMVJG:~$ echo "apple microsoft google" > demo
hyd@DESKTOP-IKHMVJG:~$ tr ' ' '\n'<demo
apple
microsoft
google

管道

在类Unix系统中,将一系列标准输入输出连接起来的进程。使用“|”连接两个命令,shell会将两个进程用管道相连。

1
2
3
4
5
hyd@DESKTOP-IKHMVJG:~$ ls  -l /etc/ > etc.txt
hyd@DESKTOP-IKHMVJG:~$ wc -l etc.txt
180 etc.txt
hyd@DESKTOP-IKHMVJG:~$ ls -l /etc/ | wc -l
180

管道的本质仍然是文件,上一个进程写入,下一个进程读取,遵循“一切皆文件”的设计原则。该管道文件不占用磁盘空间,使用内存空间。

参考连接

流、管道和重定向
Linux 的进程间通信:管道