shell学习<重定向>
时间:2007-08-29 来源:ank
默认情况下始终有3个"文件"处于打开状态, stdin(键盘)<文件描述0>, stdout(屏幕),<文件描述1> 和stderr(错误消息输出到屏幕上)<文件描述2>. 这3个文件和其他打开的文件都可以被重定向.
文件描述3-9保留 0< FILENAME < FILENAME
# 从文件中接受输入.
# 与">"是成对命令, 并且通常都是结合使用.
#
# grep search-word <filename
:> filename #as cat /dev/null >filename 和 > filename
filename若在变为空文件,不在这创建
1>filename
# 重定向stdout到文件"filename".
1>>filena
# 重定向并追加stdout到文件"filename".
2>filename
# 重定向stderr到文件"filename".
2>>filename
# 重定向并追加stderr到文件"filename".
&>filename
# 将stdout和stderr都重定向到文件"filename".
M>N
# "M"是一个文件描述符, 如果没有明确指定的话默认为1.
# "N"是一个文件名.
# 文件描述符"M"被重定向到文件"N".
M>&N
# "M"是一个文件描述符, 如果没有明确指定的话默认为1.
# "N"是另一个文件描述符.
[j]<>filename
# 为了读写"filename", 把文件"filename"打开, 并且将文件描述符"j"分配给它.
# 如果文件"filename"不存在, 那么就创建它.
# 如果文件描述符"j"没指定, 那默认是fd 0, stdin.
n<&- #0<&-, <&-
关闭输入文件描述符n
n>&- #1>&-, >&-
关闭输出文件描述符n. 使用exec
exec <filename命令会将stdin重定向到文件中. 从这句开始, 所有的stdin就都来自于这个文件了, 而不是标准输入(通常都是键盘输入). 这样就提供了一种按行读取文件的方法, 并且可以使用sed和/或awk来对每一行进行分析.
1 #!/bin/bash 2 # upperconv.sh 3 # 将一个指定的输入文件转换为大写. 4 5 E_FILE_ACCESS=70 6 E_WRONG_ARGS=71 7 8 if [ ! -r "$1" ] # 判断指定的输入文件是否可读? 9 then 10 echo "Can't read from input file!" 11 echo "Usage: $0 input-file output-file" 12 exit $E_FILE_ACCESS 13 fi # 即使输入文件($1)没被指定 14 #+ 也还是会以相同的错误退出(为什么?). 15 16 if [ -z "$2" ] 17 then 18 echo "Need to specify output file." 19 echo "Usage: $0 input-file output-file" 20 exit $E_WRONG_ARGS 21 fi 22 23 24 exec 4<&0 25 exec < $1 # 将会从输入文件中读取. 26 27 exec 7>&1 28 exec > $2 # 将写到输出文件中. 29 # 假设输出文件是可写的(添加检查?). 30 31 # ----------------------------------------------- 32 cat - | tr a-z A-Z # 转换为大写. 33 # ^^^^^ # 从stdin中读取. 34 # ^^^^^^^^^^ # 写到stdout上. 35 # 然而, stdin和stdout都被重定向了. 36 # ----------------------------------------------- 37 38 exec 1>&7 7>&- # 恢复stout. 39 exec 0<&4 4<&- # 恢复stdin. 40 41 # 恢复之后, 下边这行代码将会如预期的一样打印到stdout上. 42 echo "File \"$1\" written to \"$2\" as uppercase conversion." 43 44 exit 0 |