shell--重定向

概念

重定向

重定向指的是从文件、命令、程序、脚本获取输出并把它作为输入发送到另一个文件、命令、程序或脚本。

文件描述符

文件描述符是内核为了高效管理已被打开的文件所创建的索引,用于指向被打开的文件,所有执行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,则表示标准输入
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值