美文网首页
十二 Shell篇——管道与重定向

十二 Shell篇——管道与重定向

作者: supermanto | 来源:发表于2020-04-04 15:36 被阅读0次

    前言

    管道:进程通信的一个通信工具
    重定向:可以将程序结果输出到某个文件,也可以将文件代替键盘作为输入

    管道与管道符

    管道和信号一样,也是进程通信的方式之一
    匿名管道(管道符)是Shell编程经常用到的通信工具
    管道符是“|”,将前一个命令执行的结果传递给后面的命令

    • ps | cat

    (1)将第一条命令的输出作为第二条命令的输入

    user1@SC02ZRC4KMD6N Git % ls -l | more
    

    (2)cat和ps都是外建命令,管道符会为这两条命令建立一个子进程(ps命令运行完了所以看不到进程名),外建命令是以子进程的方式运行的。由于内建命令执行过程是不会传递给父进程的,所以使用管道符时,应该避免使用内建命令。

    user1@SC02ZRC4KMD6N Git % cat | ps -f
      UID   PID  PPID   C STIME   TTY           TIME CMD
      501   965   964   0 10:18上午 ttys000    0:00.07 -zsh
      501  1008   965   0 10:34上午 ttys000    0:00.00 cat
    

    重定向符号

    一个进程默认会打开标准输入、标准输出、错误输出三个文件描述符
    输入重定向符号“<”
     eg:read var < /path/to/a/file
    输出重定向符号“>”、“>>”,“2>”,“&>”
     eg:echo 123 > /path/to/a/file
    输入和输出重定向组合使用
     cat > /path/to/a/file <<EOF
     I am $USER
     EOF

    (1)输入重定向-统计a.txt文件的行数

    user1@SC02ZRC4KMD6N test % wc -l < a.txt
           3
    

    (2)输入重定向-将文件内容赋值给变量

    user1@SC02ZRC4KMD6N test % read var < a.txt
    user1@SC02ZRC4KMD6N test % echo $var
    11
    

    (3)输出重定向-将内容输出到文件中,原文件的内容会被清空

    user1@SC02ZRC4KMD6N test % echo $var >b.txt
    user1@SC02ZRC4KMD6N test % cat b.txt
    11
    

    (4)输出重定向-将内容输出到文件中,原文件的内容不会被清空

    user1@SC02ZRC4KMD6N test % echo $var >>b.txt 
    user1@SC02ZRC4KMD6N test % cat b.txt        
    11
    11
    

    (5)错误重定向-有错误时不会打印在终端上,而是把错误信息输出到文件中

    user1@SC02ZRC4KMD6N test % nocmd
    zsh: command not found: nocmd
    user1@SC02ZRC4KMD6N test % nocmd 2> c.txt
    user1@SC02ZRC4KMD6N test % cat c.txt
    zsh: command not found: nocmd
    

    (6)不管正确还是失败,都会讲结果输出到文件中

    # 命令错误,将结果输出到文件中
    user1@SC02ZRC4KMD6N test % nocmd &> d.txt
    user1@SC02ZRC4KMD6N test % cat d.txt
    zsh: command not found: nocmd
    # 命令正确,将结果输出到文件中
    user1@SC02ZRC4KMD6N test % ls  &> d.txt
    user1@SC02ZRC4KMD6N test % cat d.txt   
    a.txt
    b.txt
    c.txt
    d.txt
    

    (7)输入输出重定向结合使用-一般是shell脚本用于生成一个配置文件,比如在.sh文件中生成一个e.txt

    user1@SC02ZRC4KMD6N test % cat aa.sh
    #!/bin/bash
    cat > e.txt <<EOF
    echo "hello bash"
    EOF
    user1@SC02ZRC4KMD6N test % bash aa.sh
    user1@SC02ZRC4KMD6N test % cat e.txt 
    echo "hello bash"
    

    相关文章

      网友评论

          本文标题:十二 Shell篇——管道与重定向

          本文链接:https://www.haomeiwen.com/subject/yzepuhtx.html