第六章 Shell标准输入输出和错误
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第六章 Shell标准输入输出和错误相关的知识,希望对你有一定的参考价值。
文件描述符(fd):文件描述符是一个非负整数,在打开现存文件或新建文件时,内核会返回一个文件描述符,读写文件也需要使用文件描述符来访问文件。
内核为每个进程维护该进程打开的文件记录表。文件描述符只适应Unix、Linux操作系统。
6.1 标准输入、输出和错误
文件描述符 | 描述 | 映射关系 |
0 | 标准输入,键盘 | /dev/stdin -> /proc/self/fd/0 |
1 | 标准输出,屏幕 | /dev/stdout -> /proc/self/fd/1 |
2 | 标准错误,屏幕 | /dev/stderr -> /proc/self/fd/2 |
6.2 重定向符号
符号 | 描述 |
> | 符号左边输出作为右边输入 |
>> | 符号左边输出追加右边输入 |
< | 符号右边输出作为左边输入 |
<< | 符号右边输出追加左边输入 |
| | 管道符,左边输出作为右边输入 |
& | 与重定向符号一起使用 |
6.3 输出重定向
使用方法 | 描述 | 示例 |
cmd1 | cmd2 | cmd1标准输出作为cmd2的标准输入 | ls列出当前所有目录或文件,将结果作为grep的输入:ls |grep a |
cmd > file | 将cmd的标准输出重定向到file | 打印结果写到文件:echo "test" > a.txt |
cmd >> file | 将cmd的标准输出重定向追加到file | 打印结果追加到文件:echo "test" >> a.txt |
cmd 2> file | 将cmd的标准错误重定向到file | 当没有安装bc计算器时,错误输出结果写到文件: echo "1 + 1" |bc 2> error.log |
cmd 2>> file | 将cmd的标准错误重定向追加到file | 当没有安装bc计算器时,错误输出结果追加文件: echo "1 + 1" |bc 2> error.log |
cmd &> file | 将cmd标准错误和标准输出重定向到file | 当不确定执行对错时都写到文件: echo "1 + 1" |bc &> error.log |
cmd &>> file | 将cmd标准错误和标准输出重定向追加file | 当不确定执行对错时都写到文件: echo "1 + 1" |bc &>> error.log |
cmd > file 2>&1 | 将标准错误重定向到标准输出,再重定向到file | 与&>一样 |
cmd >> file 2>&1 | 将标准错误重定向到标准输出,再重定向追加到file | 与&>>一样 |
6.4 输入重定向
使用方法 | 描述 | 示例 |
cmd < file | cmd以file作为标准输入 | a.txt内容作为grep输入: # grep "test" --color < a.txt |
cmd < file1 > file2 | cmd命令以file1文件作为标准输入,并将标准输出重定向到file2 | 把a.txt标准输出写到b.txt: # cat < a.txt > b.txt |
cmd << delimiter | 读取标准输入,直到遇到delimiter终止,数字、字符串任意命名delimiter。 | # cat << EOF > 123 > abc > EOF 123 abc 将eof标准输入作为cat标准输出再写到a.txt: # cat > a.txt << eof > 123 > abc > eof |
6.5 绑定重定向
使用方法 | 描述 | 示例 |
cmd >&n | 把标准输出重定向到文件描述符n | 将ls标准输出重定向标准错误,标准错误重定向到file: ls >&1 1>file |
cmd <&n | 标准输入重定向到文件描述符n | |
cmd <&- | 关闭标准输入 | |
cmd >&- | 关闭标准输出 | |
cmd n>&- | 将文件描述符n标准输入关闭 | |
cmd n<&- | 将文件描述符n标准输出关闭 |
6.6 /dev/null
/dev/null是一个空设备,向它写入的数组都会丢弃,但返回状态是成功的。与其对应的还有一个/dev/zero设备,提供无限的0数据流。
在写Shell脚本时我们经常会用到/dev/null设备,将stdout、stderr输出给它,也就是我们不想要这些输出的数据。
通过重定向到/dev/null忽略输出,比如我们没有安装bc计算器,正常会抛出没有发现命令:
# echo "1 + 1" |bc >/dev/null 2>&1
这就让标准和错误输出到了空设备。
忽略标准输出: # echo "test" >/dev/null 忽略错误输出: # echo "1 + 1" |bc 2>/dev/null
博客地址:http://lizhenliang.blog.51cto.com
QQ群:Shell/Python运维开发群 323779636
6.7 read
read命令从标准输入读取,并把输入的内容复制给变量。
命令格式: read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]
-e | 在一个交互shell中使用readline获取行 |
-r | 不允许反斜杠转义任何字符 |
-s | 隐藏输入 |
-a array | 保存为数组,元素以空格分隔 |
-d delimiter | 持续读取直到遇到delimiter第一个字符退出 |
-i text | 将test文本作为 |
-n nchars | 读取nchars个字符返回,而不是等到换行符 |
-N nchars | 读取nchars个字符返回,除非遇到文件结束符或超时,其他分隔符都被忽略 |
-p prompt | 提示信息 |
-t timeout | 等待超时时间,秒 |
-u fd | 指定文件描述符号码作为输入,默认是0 |
name | 变量名 |
示例:
获取用户输入保存到变量:
# read -p "Please input your name: " VAR Please input your name: lizhenliang # echo $VAR lizhenliang
用户输入保存为数组:
# read -p "Please input your name: " -a ARRAY Please input your name: a b c # echo ${ARRAY[*]} a b c
遇到e字符返回:
# read -d e VAR 123 456 e # echo $VAR 123 456
从文件作为read标准输入:
# cat a.txt adfasfd # read VAR < a.txt # echo $VAR adfasfd
while循环读取每一行作为read的标准输入:
# cat a.txt |while read LINE; do echo $LINE; done 123 abc
分别变量赋值:
# read a b c 1 2 3 # echo $a 1 # echo $b 2 # echo $c 3 # echo 1 2 3 | while read a b c;do echo "$a $b $c"; done 1 2 3
本文出自 “李振良的技术博客” 博客,请务必保留此出处http://lizhenliang.blog.51cto.com/7876557/1883935
以上是关于第六章 Shell标准输入输出和错误的主要内容,如果未能解决你的问题,请参考以下文章