命令列表:

command > file 输出重定向到file
command < file 输入重定向到file
command >> file 输出以追加方式重定向到file
n > file 文件描述符为n输出重定向到file
n >> file
n >& m 将输出文件m和n合并
n <& m 将输入文件m和n合并
<<tag 将开始标记tag和结束标记tag之间的内容作为输入
command &> file 将执行command的标准和错误都输出到file

一般n文件描述符用的多的为 0 ,1 , 2, 分别表示标准输入、标准输出和错误输出

探讨重定向时首先要了解文件描述符, shell中通过文件描述符来标识特定的位置; 了解文件描述符之后再探讨具体的操作, 如重定向错误, 脚本中进行重定向输入/输出; 考虑到需要暂时保存某些数据, 使用临时性文件来创建日志将是一个不错的选择; 当然,一些特殊的操作如将输出同时重定向到显示器和日志文件也会讲述; 最后再会举一些实例.

  • 文件描述符
  • 重定向操作
  • 临时性文件
  • 记录消息
  • 实例

文件描述符


Linux将一切视作文件, Linux使用文件描述符来标识每个文件对象. 每个进程可以用9个文件描述符, 特殊的文件描述符有以下3个:

0 STDIN 标准输入
1 STDOUT 标准输出
2 STDERR 标准错误

三者的用途一看就懂:

  1. cat # 从STDIN中接收数据
  2. ls -l > file # 将STDOUT输出到file中
  3. ls -l >> file # STDOUT追加到file
  4. ls -al badfile > test3 # STDERR默认和STDOUT都指向终端

重定向操作


重定向错误:

ls -al badfile 2>file #将错误重定向到file
ls -al file1 badfile &>file #将错误和输出重定向到file

脚本中进行重定向


临时重定向:

echo "This is an error message" > &2 #将输出重定向到STDERR

永久重定向:

exec 1>file # STDOUT 永久重定向到file
echo "message1"
echo "message2" # 输出到file

重定向输入:

exec 0<file
while read line
do
echo $line
done

其余重定向:
可以使用3-8文件描述符进行重定向

exec 3>file
echo "message" >&3

可以使用这些文件描述符来恢复已重定向的文件描述符:

exec 3>&1
exec 1>file
do...
exec 1>&3


exec 6<&0
exec 0<file
do...
exec 0<&6

关闭文件描述符:

exec 3>&-

阻止命令输出可以重定向到/dev/null

临时性文件


在Linux有个/tmp目录, 该目录存放不需要永久保存的文件, 系统在启动会自动删除该目录下的文件; 当然, 用户自己也可以创建临时文件.

创建临时性文件:

mktemp # 默认在/tmp下创建temp.XXXXXX问价
mktemp test.XXXXXX # test.XXXXXX为文件名模板, 在当前目录下创建该文件名, X会被替换保障文件名唯一, 该命令会返回文件名
mktemp -t test.XXXXXX # 在/tmp目录下创建临时文件, 返回全路径名

创建临时目录:

mktemp -d dir.XXXXXX

脚本中使用临时性文件:

tempfile=$(mktemp test1.XXXXXX)
exec 3>$tempfile

记录消息


记录消息实质上就是将输出同时发送到显示器和日志文件, 使用tee命令即可

tee filename
date | tee testfile #接收管道重定向输入
date | tee -a testfile # 数据追加到文件

实例


outfile='member.sql'
IFS=',' #for循环读取的分割符
while read -r lname fname address city state zip || [[ -n $zip ]]
do
    cat >> $outfile << EOF
    INERT INTO members (lname, fname, address, city, state, zip) values("$lname", "$fname", "$address", "$city", "$state", "$zip");
EOF
done < "$1"

从.csv文件读取信息并保存到sql文件中

输出重定向


举例:

cat file1 > file2     #file1输出到file2
cat file1 >> file2 #file1追加到file2

输入重定向


举例:

wc -l file1 #会打印文件名
wc -l < file1  #不会打印文件名,wc从标准输入获取数据

重定向重点

0,1,2分别代表标准输入、标准输出和错误输出

command 2>>file
command > file 2>&1 #标准输出、错误输出重定向到file

Here Document


将输入重定向到一个交互式脚本和命令

语法:

command << delimiter
document
delimiter

示例:

wc -l << EOF
第一行
第二行

EOF

/dev/null


黑洞文件,丢失所有输入的内容。用于禁止输出

示例:

cat >/dev/null 2>&1