第六章 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 | cmd2cmd1标准输出作为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 < filecmd以file作为标准输入

a.txt内容作为grep输入:

# grep "test" --color < a.txt 

cmd < file1 > file2cmd命令以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标准输入输出和错误的主要内容,如果未能解决你的问题,请参考以下文章

第六章 文件和输入输出

VLSI基础-- 第六章 时序逻辑电路

第六章 命令集结

第六章 Shell数组应用

SHELL环境变量初识(第六章)

Shell标准输入标准输出和标准错误的重定向总结