管道:进程通信的一个通信工具
重定向:可以将程序结果输出到某个文件,也可以将文件代替键盘作为输入
管道与管道符
管道和信号一样,也是进程通信的方式之一
匿名管道(管道符)是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"