Unix & Linux笔记(6)

第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中运行一组命令,或者就一条命令,但又不希望启动一个新的shellUnix为这种情况提供了一个特殊的工具:将命令括在圆括号中,这样就可以告诉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."

你可能感兴趣的:(Unix & Linux笔记(6))