概念
重定向
重定向指的是从文件、命令、程序、脚本获取输出并把它作为输入发送到另一个文件、命令、程序或脚本。
文件描述符
文件描述符是内核为了高效管理已被打开的文件所创建的索引,用于指向被打开的文件,所有执行I/O操作的系统调用都通过文件描述符;文件描述符是一个简单的非负整数,用以表明每个被进程打开的文件。程序刚刚启动时,第一个打开的文件是0,第二个是1,以此类推。也可以理解为文件的身份ID。一般使用的文件描述符的范围为0~9。
文件重定向
重定向有关的文件描述符:
POSIX字符(文件描述符) | 描述 | 操作符 |
---|---|---|
0 | 标准输入(stdin),从文件(或键盘)读取输入 | < |
1 | 标准输出(stdout),发送数据到文件(默认是屏幕) | >或1> |
2 | 标准错误(stderr),发送错误信息到一个文件(默认是屏幕) | 2> |
文件重定向是更改一个文件描述符以指向一个文件,先看一个输出重定向:
$ echo 'hello world' > 1.txt
$ cat 1.txt
hello world
操作符">"开始一个输出重定向,这个重定向发生在echo命令执行之前。默认情况下,Bash不会检查1.txt这个文件是否存在,只是打开这个文件,若文件已存在,文件中内容会丢失,若文件不存在,会创建一个新文件。
使用输入重定向将一个文件连接到标准输入,以便标准输入不再从键盘中读取,而是从文件读取:
$ cat < 1.txt
hello world
相关例子
从文件输入
#!/bin/bash
# 参数个数不为1时,提示用户用法
if [ $# -ne 1 ]; then
echo "Uage: $0 FILEPATH"
exit
fi
file=$1
{
# 读取一行内容,并将读取的内容存入变量line1
read line1
read line2
# 将标准输入从屏幕输入改为从文件中读取
} < $file
echo "file=$file, line1=$line1, line2=$line2"
exit 0
结合循环使用:
#!/bin/bash
if [ $# -ne 1 ]; then
echo "Uage: $0 filename"
exit
fi
filename=$1
count=0
# while和until循环都可以
# until ! read line
while read line
do
let count++
echo "$count $line"
# 将整个while循环的标准输入指向文件
done < $filename
echo -e "\n Total $count lines read."
exit 0
从文本或字符串输入
还有一种重定向类型为here-documents,操作符为"<<MARKER",,这个操作符指的是从标准输入读取内容,直到读取到只包含MARKER的行为止。
语法格式:
$ command <<[-]MARKER
> 输入文本
> 直到遇到MARKER
[-],忽略行首的制表符
常用于向用户显示命令或脚本的用法:
usage(){
cat <<-EOF
usage:command [-x] [-v] [-z] [file...]
explian...
EOF
}
here-strings是一个用于输入重定向的普通字符串,操作符为"<<<",语法为:
$ command <<<WORD
注意点:若字符串之间有空格,需要用双引号引用。
创建空文件
创建一个空文件的语法:
$ >filename
写入到/dev/null
写入到/dev/null的所有数据会被系统丢弃。
# 重定向命令的标准输出信息到/dev/null
command > /dev/null
# 重定向命令的标准错误信息到/dev/null
command 2> /dev/null
#同时重定向命令的标准输出和标准错误的信息到/dev/null
command &> /dev/null
或
command >& /dev/null
或
command > /dev/null 2>&1
一般用于删除一些没有用的干扰信息。
输出相关
输出重定向 | 命令 |
---|---|
标准错误重定向 | command 2> filename |
标准输出重定向 | command > filename |
标准错误和输出同时重定向 | command &> filename command >& filename command > filename 2>&1 command 2>&1 > filename |
追加重定向输出 | command >> filename |
将命令的标准输出和标准错误输出追加到一个日志文件上:
command >>ex.log 2>&1
或
command 2>&1 >>ex.log
在一条命令行中完成标准输入和标准输出的重定向:
command < input-file > output-file
或
< input-file command > output-file
将一个文件的内容都转换成小写,并将转换后的内容写入新文件。
$ tr A-Z a-z < filename > new_filename
exec命令
exec命令:操作文件描述符,若exec之后没有指定命令,则exec命令之后的重定向将更改当前shell的文件描述符。
命令 | 作用 |
---|---|
exec [n]< file | 指定用于输入的文件描述符,若不指定n,则表示标准输入(文件描述符0) |
exec [n]> file | 指定用于输出的文件描述符,若不指定n,则表示标准输出(文件描述符1) |
exec [n]<&- exec [n]>&- | 关闭文件描述符,’<&-'关闭标准输入,'2>&-'关闭标准错误 |
exec [n]<> file | 打开用于读和写的文件描述符,若不指定n,则表示标准输入 |