您的位置:首页 > 运维架构 > Linux

Unix & Linux笔记(6)

2016-05-27 14:46 232 查看

第15章 标准
I/O
:重定向和管道

15.1
Unix
设计准则

Small is beautiful .

Less is more .

15.2
Unix
设计新准则

除非程序无法更小,否则小的就是完美的。

三个问题:

1
. 这个程序可以做什么?

2
. 这个程序有哪些基本细节?

3
. 在需要的时候可以在哪里查找到更多的帮助?

15.3 标准输入、标准输出和标准错误

基本思想
每一个基于文本的程序都应该能够从任何源接受输入,并向任何输出目标写入输出。

shell
控制抽象
I/O


标准
I/O
(
standard  I/O
)

stdin
stdout
stderr


15.4 重定向标准输出

sort > name
sort >> name


15.5 防止文件被重定向替换或创建

告诉
shell
当使用
>
重定向时,不要替换已经存在的文件。

set −o noclobber


set +o noclobber


临时忽略设置进行替换

sort >| names


15.6 重定向标准输入

默认标准输入被设置为键盘,可以重定向标准输入,使其从文件中读取数据。

sort < /ect/passwd


sort < /ect/passwd > df


15.7 文件描述符、
Bourne shell
家族重定向标准错误

两种不同的输出目标:标准输出,标准错误

文件描述符(
file descriptor

Unix
进程中,每个输入源和每个输出目标都有一个唯一的数字标识,这个数字标识称为文件描述符(
file descriptor
)。

#1
#5


Unix
为每个进程提供三个预定义的文件描述符,而且大多数时候已经够用。默认的文件描述符是
0
代表标准输入,
1
代表标准输出,
2
代表标准错误。

15.8 子
shell

当创建子
shell
时,它继承父
shell
的环境,但是子
shell
对于环境的任何改变都不会传递回父
shell
。希望在子
shell
中运行一组命令,或者就一条命令,但又不希望启动一个新的
shell
Unix
为这种情况提供了一个特殊的工具:将命令括在圆括号中,这样就可以告诉
shell
在子
shell
中运行命令。

可以改变工作目录、创建或修改环境变量、创建或修改
shell
变量、改变
shell
选项

编组
grouping

使用编组和子
shell
的最常见原因是防止
cd
命令影响当前目录。

(cd directory; command)


15.9 在
C-shell
家族中重定向标准错误

当使用
>&
时,
C-shell
将同时重定向标准输出和标准错误。有一种方法可以使标准错误和标准输出的重定向分离。

(command > outputfile) >& errorfile
(command >> outputfile) >>& errorfile


15.10 组合标准输出和标准错误

对于
C-shell
家族

>&
>>&


对于
Bourne shell
家族

基本思想就是将一种类型的输出重定向到一个文件,再将另有一种类型的输出重定向到同一位置。

command x> outputfile  y>&x


简单的做法,可以使用
&>
或者
>&
同时重定向标准输出和标准错误。

15.11 抛弃输出

第一,抛弃标准输出

(B)update > /dev/null  (C)(update > /dev/null) >& errors


第二,抛弃标准错误

(B)update 2> /dev/null (C)(update > /dev/tty)>& /dev/null


第三,抛弃所有输出

(B)update > /dev/null   2>&1 (C)update >& /dev/null


15.12 重定向:小结和体验

15.13 管道线

管道
pipe


管道线
pipeline


通常,标准错误流不会通过管道传输;它们被合并输出到控制台。然而,很多
Shell
提供一些扩充的语法去改变这一行为。比如在
C-shell
中, 使用
|&
代替
|
来表示错误流也需要被合并进入标准输出,并传递给下一个进程。
Bourne shell
也可以合并错误流,通过
2>&1
也可以将错误流重定向到一个不同的文件。(from维基百科)

将标准输出和标准错误组合在一起,通过管道线一起发送给另一个程序

对于Bourne shell家族  command1 2>&1 | command2
对于C-shell家族   command1 |& command2


15.14 管道线分流:
tee

tee
的作用就是从标准输入读取数据,并向标准输出和文件各发送一份数据。

tee  [-a]  file…
-a  append,在文件末尾追加数据
cat a b c | tee –a backup | less


特别注意这种模式
command | tee file
,注意不必在
tee
之后使用另一个程序,因为
tee
默认将它的输出发送给标准输出,即屏幕。

15.15 管道线的重要性

马尔科姆·道格拉斯·麦克罗伊 Malcolm Douglas McIlroy

15.16 条件执行

在前一条命令成功执行条件下执行另一条命令

command1 && command2


在前一条命令执行失败条件下执行另一条命令

command1 || command2


update || echo "The update program failed."
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: