《Linux Shell》之八:I/O重定向
# 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重定向符号及其意义:
#!/bin/bashexec 8<&0 #FD 8是FD 0即标准输入的副本,用于恢复FD 0exec < hfileread aread becho "-----------------"echo $aecho $becho "close FD 8"exec 0<&8 8<&- #将FD 8恢复给FD 0后,关闭FD 8,以便其它进程可以使用FD 8这个文件标识符echo -n "Pls. enter data: "read cecho $c?< 等价于 0<符号
?
再看将标准输出重定向到文件的例子:
#!/bin/bashexec 8>&1exec > loggerecho "output ...."dateecho "----------"dfexec 1>&8 8>&- # 将FD 8复制到FD 1 并关闭FD 8好让其它进程可以使用这个文件标识符echo "after reset...."datedf
?> 符号和 1>等价
?
高级I/O重定向符号及其意义:
#!/bin/bashls /etc > loggerwhile [ "$filename" != "rc.d" ]do read filename let "count += 1"done < loggerecho "$count times read"echo -n "---------Pls input file"read testecho $test?
10.3.2 eval命令
eval命令将其参数作为命令行,让shell重新执行该命令行,eval的参数再次经过shell命令行处理的12个步骤
如果变量中包含任何需要shell直接在命令中看到的字符,就需要使用eval命令。命令结束符(; | &)、IO重定向符(< >)和引号这些对shell具有特殊意义的符号,就必须直接出现在命令行中,否则就要使用eval
#!/bin/bashecho "the number is $#"echo -n "the arg is : $(eval echo \$$#)"echo "----------END---------------"
?
?
?