一、基本的I/O重定向
标准的输入/输出可能是软件设计原则最重要的概念了,这个概念就是:程序应该有数据的来预案段,数据的目的端(数据要去的地方)以及报告问题的地方,它们分别被称为标准输入(input)、标准输出(output)已经标准错误输出(error)。I/O重定向就是通过与终端交互,或是在shell脚本里设置,重新安排从哪里输入或输出到哪里;我个人理解同python的重定向一样,数值转换字符、字符转换数值;
二、重定向与管道
1、以<改变标准输入
program < file 可将program的标准输入修改为file
tr -d '\r' < 1.txt...
2、以 > 改变标准输出
program > file 可将program的标准输出修改为file
tr -d '\r' < doc-file.txt > UNIX-file.txt 这条命令会先以tr将doc-file.txt里的ASCLL carriage-return(回车)删除,在将转换完成的数据输出到UNIX-file.txt。doc-file.txt里的原始数据不会有变化
> 重定向符在目的文件不存在时会新建一个,如果目的文件存在会覆盖掉,原本的数据会丢失。
3、以 >>附加到文件
program >> file 可将program的标准输出附加到file的结尾处,如同> ,如果目的文件不存在,>>重定向符会新建一个,如果目的文件存在,它不会覆盖掉文件,而是将程序产生的数据附加到文件结尾处;
4、以 | 建立管道
program1 | porgam2 可将1的标准输出修改为2的标准输入。
不同于<和>可将输入与输出连接到文件,管道可以把两个以上执行中的程序衔接在一起,第一个程序的标准输出可以变成第二个程序的标准输入,这么做的好处就是管道可以使得执行速度比使用临时文件的程序快上10倍;
tr -d '\r' < dos-file.txt | sort > unix-file.txt
这条管道的会先删除输入文件内的回车字符,在完成数据的排序之后,将结果输出到目的文件。
5、tr的语法介绍
tr [optinos] source-char-list replace-char-list
用途:转换字符、例如将大写字符转换成小写。或者可以删除指定的字符、再或者将一串重复出现的字符浓缩成一个
常用选项:-c 取source-char-list的反义,tr要转换的字符,变成未列在source-char-list中的字符,此选项通常与-d或-s配合使用
-C 与-c相似,但所处理的是字符,而非二进制的字节值
-d 删除source-char-list里所列的字符,而不是转换他们
-s 浓缩重复的字符。如果标准输入中连续出现source-char-list里所列的字符,则将其浓缩车一个;
三、特殊文件:/dev/null与/dev/tty
1、/dev/null。传送到此文件的数据都会被系统丢掉。也就是说,当程序将数据写到此问件事,会认为它已成功完成写入数据的操作,但实际上什么事情都没做、如果你需要的是命令的推出状态,而非它的输出,此功能会很有用,例如,测试一个文件是否包含某个模式:
if grep pattern myfile > /dev/null
then
... 找到模式时
else
... 找不到模式时
fi
相对的,读取/dev/null 则会立即返回文件结束符号(end-of-file)。读取/dev/null的操作会很少出现在shell程序里,不过了解这个文件的行为模式还是非常重要的。
2、/de/tty
当程序打开此文件时、unix会自动将它重定向到一个重点(一个实体的控制台或穿行端口,也可以使一个通过网络与窗口登录的未中断)再与程序结合、这在程序必须读取人工输入时(例如密码)特别有用;也可以用来产生错误信息;
printf “Enter new password:”提示输入
stty -echo 关闭自动打印输入的字符功能
read pass < /dev/tty 读取密码
printf “Enter again:” 提示再次输入
read pass2 </dev/tty 再次读取密码
stty echo 打开自动打印输入的字符功能