tvk 2020-04-06
管道:进程通信的一个通信工具
重定向:可以将程序结果输出到某个文件,也可以将文件代替键盘作为输入
管道和信号一样,也是进程通信的方式之一
匿名管道(管道符)是Shell编程经常用到的通信工具
管道符是“|”,将前一个命令执行的结果传递给后面的命令
- ps | cat
(1)将第一条命令的输出作为第二条命令的输入
Git % ls -l | more
(2)cat和ps都是外建命令,管道符会为这两条命令建立一个子进程(ps命令运行完了所以看不到进程名),外建命令是以子进程的方式运行的。由于内建命令执行过程是不会传递给父进程的,所以使用管道符时,应该避免使用内建命令。
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文件的行数
test % wc -l < a.txt 3
(2)输入重定向-将文件内容赋值给变量
test % read var < a.txt test % echo $var 11
(3)输出重定向-将内容输出到文件中,原文件的内容会被清空
test % echo $var >b.txt test % cat b.txt 11
(4)输出重定向-将内容输出到文件中,原文件的内容不会被清空
test % echo $var >>b.txt test % cat b.txt 11 11
(5)错误重定向-有错误时不会打印在终端上,而是把错误信息输出到文件中
test % nocmd zsh: command not found: nocmd test % nocmd 2> c.txt KMD6N test % cat c.txt zsh: command not found: nocmd
(6)不管正确还是失败,都会讲结果输出到文件中
# 命令错误,将结果输出到文件中 test % nocmd &> d.txt test % cat d.txt zsh: command not found: nocmd # 命令正确,将结果输出到文件中 test % ls &> d.txt test % cat d.txt a.txt b.txt c.txt d.txt
(7)输入输出重定向结合使用-一般是shell脚本用于生成一个配置文件,比如在.sh文件中生成一个e.txt
test % cat aa.sh #!/bin/bash cat > e.txt <<EOF echo "hello bash" EOF test % bash aa.sh test % cat e.txt echo "hello bash"