标准I/O和管道

IO重定向及管道
程序:指令+数据
读入数据:Input
输出数据:Output\

打开的文件都有一个fd:file descriptor(文件描述符)

  • 标准输入:keyborad,0
  • 标准输出:monitor,1
  • 标准错误输出:monitor,2

I/O重定向:改变标准位置

  • 输出重定向:CMD > NEW_POS, CMD >>NEW_POS
  • > 覆盖重定向,目标文件中的原有内容会被清除。
>后面如果跟的是软链接文件,则会清空源文件
> 如果跟的是/dev/sda1或/dev/zero这样的设备文件呢这样的文件是破坏不了的.
如果后面跟的是文件:
    存在改变mtime和ctime,并覆盖文件
    不存在,则创建文件,刷新时间戳

>>:追加重定向,新内容会追至目标文件尾部。
cat > file------>单行重定向,但会清空文件, 追加文件用 >>

set –C 禁止将内容覆盖输出至已有文件,但可追加
>| file 强制覆盖
set +C 允许覆盖

2>:覆盖重定向错误输出数据流
2>>:追加重定向错误输出数据流

标准输出和错误输出各自定向到不同位置
cmd > /path/to/file.out 2> /path/to/file.out

合并标准输出和错误输出为同一个数据流进行重定向:
&>:覆盖重定向
&>>:追加重定向\

CMD > /path/to/file.out 2>&1
CMD >> /path/to/file.out 2>&1


输入重定向:<
tr命令:转换和删除字符
Usage: tr [OPTION]... SET1 [SET2]\

  • -c: 取反\
  • -d: 删队字符集里的字符\
  • -s: 压缩连续的字符成一个字符\
  • -t: 将第一个字符集的内容变成第 二个字符的内容
    [:alnum:]:字母和数字\
    [:alpha:]:字母
    [:cntrl:]:控制(非打印)字符 \
    [:digit:]:数字
    [:graph:]:图形字符
    [:lower:]:小写字母
    [:print:]:可打印字符
    [:punct:]:标点符号
    [:space:]:空白字符
    :upper:]:大写字母
    :xdigit:]:十六进制字符
    前面的字符集少不替换,多时后面的字符会替换------>tr 'ab' 'xyz'
HWEW Documentation:<<
        cat << EOF
cat > /path/to/somefile << EOF
    如果/path/to/somefile文件存在会覆盖
     如果是cat >> f1 那是追加

示例:
ls /eee /root >log1 2>&1------------>把错的变成对的
ls /eee /root 2>&1 >log2------->错的没办法变成对的,注意顺序 只有对的
ls /eee /root &> log3--------->&> 把所有输出重定向到文件
ls /eee /root 2>log4 >&2----------->把对的变成错的

cat < f1 > f2--------->f1覆盖f2,复制了f1,并改名为f2
cat < f2 > f2---------->将f2的内容清空
cat > f1 < f2 --------->f1的内容清空,f2的内容填充至f1 .
cat > f1 < f1------------>将f1清空
cat < /etc/centos-release >f1-------------------->这实现了cp的功能了

管道
cmd1 | cmd2 | cmd3 |...
最后一个命令会在当前shell进程的子进程
STDERR默认不能通过管道转发,可利用2>&1 或 |& 实现
ls /err /root 2>& | cmd2========ls /err /root |& cmd2

管道中 - 符号

 示例:
将 /home 里面的文件打包,但打包的数据不是记录到文件,而是传送到     stdout,经过管道后,将 tar -cvf - /home 传送给后面的 tar -xvf - ,     后面的这个 - 则是取前一个命令的 stdout, 因此,就不需要使用临时file了
       tar -cvf - /home | tar -xvf -
        又压缩又解压缩,文件名叫什么无所谓了,用-来代替

tree命令
cmd1 | tee [-a ] filename | cmd2
把cmd1的STDOUT保存在文件中,做为cmd2的输入
-a 追加 默认覆盖
使用:

  • 保存不同阶段的输出
  • 复杂管道的故障排除
  • 同时查看和记录输出

mail邮件
mail -s ‘标题’ 用户(不能出现变量),
邮件的内容可以出现变量和命令调命令。

mail: 通过电子邮件发送输入 /var/spool/mail
邮箱存放路径:/var/spool/mail/用户名
用户收发邮件就是从这个文件里读的

echo "test email" | mail -s "test" [email protected] 
ls /eee /root 2>&1 | mail -s help root
ls /eee /root  |& mail -s help root

lpr:把输入发送给打印机
echo "test print" | lpr -P printer_name

你可能感兴趣的:(标准I/O和管道)