《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---------------"
本人博客已搬家,新地址为:http://yidao620c.github.io/