程序是由指令 + 数据组成
程序的数据流有三种:
输入数据流:<- 标准输入(stdin), 一般默认是键盘
输出数据流:->标准输出(stdout), 一般默认到终端窗口
错误输出流:->标准错误(stderr), 一般默认到终端窗口
标准输入: 0
标准输出: 1
错误输出: 2
I/O 重定向: 改变默认位置
输出重定向: 将标准输出 (stdout) 和标准错误 (stderr) 重定向到指定位置
格式: 命令 操作符号 文件名
支持的操作符号:
> : 把标准输出 (stdout) 重定向到文件, 会覆盖原文件内容
>> : 把标准输出 (stdout) 重定向到文件, 会在原有内容基础上, 追加内容
说明: 上面是讲 ll 显示的结果输出重定向到文件 file 中, 使用>时, file 文件被覆盖了, 使用>>时, 原文件 file 和重定向的内容都显示了, 是追加内容
2> : 把标准错误 (stderr) 重定向到文件, 会覆盖原内容
2>>: 把标准错误 (stderr) 重定向到文件, 会在原内容基础上, 追加内容
说明: 将命令执行的错误结果显示在 file 文件中, 使用 2 > 时, 覆盖了原文件 file 输出的, 使用 2>>时, 原文 件内容和标准错误都显示了, 是追加内容
&>: 把所有的输出重定向到文件, 不管对错都输出到指定位置, 覆盖输出
&>>: 把所有的输出重定向到文件, 不管对错都输出到指定位置, 追加输出
说明: 使用 &>或者 &>>时, 执行 ll 时, 是标准输出, lls 是标准错误, 但是不管是哪个的输出都重定向到 file 文件中, 2>&1 和 &>,&>>效果一样, 2>&1 是老版本使用, 要在最后使用, 才有效果.
- command>/path/toshmefile 2>&1
- command>>/path/to/somefile 2>&1
理解: A 和 B, 将 A 输出到 B 上, 如果对了, 就正常输出到 B 上, 如果错误了, 内容还是输出在 B 上
set -C: 禁止将内容覆盖已有的文件, 但是可以追加强制覆盖 :
set +C: 允许覆盖
合并多个程序的标准输出
(command ;command)>file
说明: 将 ll 和 echo shell 的标准输出一起重定向到 file 文件中, 此法只能用于标准输出,
标准错误不能使用
tr: 转换和删除字符
tr [option] .. SET1 [SET2]==>[]非必选
选项:
-c: 取字符的补集 ==>取代所有不属于第一字符集的字符
-d: 删除所有属于第一个字符集的字符
-s: 把连续重复的字符以单独一个字符表示
-t: 将第一个字符集对应字符转换为第二字符集对应的字
管道使用符号 | 来连接命令
command1 |command2 |command3...
1. 将命令 1 的标准输出发送给命令 2, 作为命令 2 的标准输入, 命令 2 的标准输出发给 command3, 作为 command3 的标准输入....
2. 标准错误默认不能通过管道转发, 但是可以利用 2>&1 或者 |& 实现
3. 最后一个命令会在当前 shell 进程的子 shell 进程中执行
4. 可以组合多种工具
tee 命令:
command1 |tee filename | command2
把 command1 的标准输出保存在文件中, 然后管道输入给 command2
特点:
1. 保存不同阶段的输出
2. 复杂管道的故障排除
3. 同时查看和记录输出
练习
1. 将 / root / 下文件列表, 显示成一行, 并文件名之间用空格隔开
ls /root/ |tr '\n' ' '
2. 计算 1+2+3+..+99+100 的总和
echo {1..100}|tr '''+' |bc
3. 将 PATH 变量每个目录显示在独立的一行
echo $PATH |tr ":" "\n"
4. 将指定文件中 0-9 分别替代成 a-j
cat /etc/issue | tr '0-9' 'a-j'
5. 将文件 / etc/centos-release 中每个单词 (由字母组成) 显示在独立的一行, 并无空行
cat /etc/centos-release | tr """\n"
来源: http://www.bubuko.com/infodetail-2559252.html