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

前言

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

管道与管道符

管道和信号一样,也是进程通信的方式之一
匿名管道(管道符)是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篇——管道与重定向

上一篇:十五、进程管理——进程查看ps、top


下一篇:通过inotify实现监控文件并执行shell(shell编写实现)