日期:2014-05-16  浏览次数:20801 次

《Linux Shell》之八:I/O重定向

10.1.3 sed命令与管道

sed [option] 'sed command' inputfile

管道格式: | sed [option] 'sed command'

var1="Yahoo develops"

replace=Google

var2=$(echo $var1 | sed "s/Yahoo/$replace/g")

echo $var2

?

10.1.4 awk命令与管道

# awk -F ":" '{print $1 | "sort"}' /etc/passwd

# df -k | awk '$4>1000000'

?

10.2 I/O重定向

当linux系统启动一个进程时,将自动为该进程打开三个文件:stdin、stdout、stderr,分别由文件标识符0、1、2标识。

tee 命令 可以将shell命令的输出从stdout复制一份到某个文件中去

比如 ?

# who | tee output

# who | tee -a output ?--> 追加到末尾

tee命令主要用于shell脚本的调试,尤其是管道的调试

基本I/O重定向符号及其意义:

符号 意义
cmd1 | cmd2 管道符,cmd1的输出当做cmd2的输入
> filename 标准输出写到filename中,覆盖
< filename 将文件内容读入到标准输入中去
>> filename 标准输出写到filename中,追加
>| filename 即使noclobber已开启,也写到文件中去,覆盖
n>| filename 即使noclobber已开启,也将FD为n的输出写到filename中去,覆盖
n> filename 将FD为n的输出写到文件filename中去
n< filename 将filename内容读入到FD为n中过去
n>> filename 将FD为n的输出写到filename中去,添加
<<delimiter 此处文档Here-document?

?

另外,介绍下bash的内置set命令选项:

set命令可以用来定制shell环境,使用选项“o”来打开或者关闭选项。例如打开选项:set -o 选项,关闭选项目:set +o 选项

# set -o #查看当前设置情况

noclobber选项设置是否能覆盖文件,如果设置了on就表示不允许覆盖文件,但是 >| 和 >>|是忽略这个选项的。可以自己试验下,不解释。

?

10.2.3 exec命令的用法:

exec命令可以通过文件标识符打开或关闭文件,也可以将标准输入从键盘输入重定向到文件,以及将标准输出重定向到文件。

先看将标准输入重定向到文件的例子:

#!/bin/bash

exec 8<&0  #FD 8是FD 0即标准输入的副本,用于恢复FD 0

exec < hfile
read a
read b
echo "-----------------"
echo $a
echo $b
echo "close FD 8"
exec 0<&8 8<&-  #将FD 8恢复给FD 0后,关闭FD 8,以便其它进程可以使用FD 8这个文件标识符

echo -n "Pls. enter data: "
read c
echo $c

?< 等价于 0<符号

?

再看将标准输出重定向到文件的例子:

#!/bin/bash

exec 8>&1
exec > logger

echo "output ...."
date
echo "----------"
df
exec 1>&8 8>&- # 将FD 8复制到FD 1 并关闭FD 8好让其它进程可以使用这个文件标识符
echo "after reset...."
date
df

?> 符号和 1>等价

?

高级I/O重定向符号及其意义:

符号 意义
n>&m 将FD为m的输出复制到FD为n的文件
n<&m 将FD为m的输入复制到FD为n的文件
n>&- 关闭FD为n的输出
n<&- 关闭FD为n的输入
&>file 将stdout和stderr重定向到file

?

10.2.4 代码块重定向或者函数重定向

#!/bin/bash

ls /etc > logger

while [ "$filename" != "rc.d" ]
do
    read filename
    let "count += 1"
done < logger

echo "$count times read"
echo -n "---------Pls input file"
read test
echo $test

?

10.3.2 eval命令

eval命令将其参数作为命令行,让shell重新执行该命令行,eval的参数再次经过shell命令行处理的12个步骤

如果变量中包含任何需要shell直接在命令中看到的字符,就需要使用eval命令。命令结束符(; | &)、IO重定向符(< >)和引号这些对shell具有特殊意义的符号,就必须直接出现在命令行中,否则就要使用eval

#!/bin/bash

echo "the number is $#"
echo -n "the arg is : $(eval echo \$$#)"
echo "----------END---------------"

?

?

?