工程师计划 linux Shell 标准输入、输出和错误

Shell 标准输入、输出和错误

文件描述符(fd):文件描述符是一个非负整数,在打开现存文件或新建文件时,内核会返回一个文件描述符,读写文件也需要使用文件描述符来访问文件。
内核为每个进程维护该进程打开的文件记录表。文件描述符只适于 Unix、Linux 操作系统。

标准输入、输出和错误

文件描述符 描述 映射关系
0 标准输入,键盘 /dev/stdin -> /proc/self/fd/0
1 标准输出,屏幕 /dev/stdout -> /proc/self/fd/1
2 标准错误,屏幕 /dev/stderr -> /proc/self/fd/2

重定向符号

符号 描述
> 符号左边输出作为右边输入(标准输出)
>> 符号左边输出追加右边输入
< 符号右边输出作为左边输入(标准输入)
<< 符号右边输出追加左边输入
& 重定向绑定符号

输入和输出可以被重定向符号解释到 shell。
shell 命令是从左到右依次执行命令。
下面 n 字母是文件描述符。

重定向输出

1)覆盖输出
一般格式:[n]>word
如果 n 没有指定,默认是 1
示例:

打印结果写到文件:
# echo “test” > a.txt
当没有安装 bc 计算器时,错误输出结果写到文件:
# echo “1 + 1” |bc 2 > error.log

2)追加重定向输出
一般格式:[n]>>word
如果 n 没有指定,默认是 1
示例:

打印结果追加到文件:
# echo “test” >> a.txt
当没有安装 bc 计算器时,错误输出结果追加文件:
# echo “1 + 1” |bc 2 > error.log

重定向输入

一般格式:[n]<word
如果 n 没有指定,默认是 0
示例:

a.txt 内容作为 grep 输入:
# grep “test” –color < a.txt

重定向标准输出和标准错误

1)覆盖重定向标准输出和标准错误
&>word 和>&word 等价于 >word 2>&1
&将标准输出和标准输入绑定到一起,重定向 word 文件。
示例:

当不确定执行对错时都覆盖到文件:
# echo “1 + 1” |bc &> error.log
当不确定执行对错时都覆盖到文件:
# echo “1 + 1” |bc > error.log 2>&1

2)追加重定向标准输出和标准错误
&>>word 等价于>>word 2>&1
示例:

当不确定执行对错时都追加文件:
# echo “1 + 1” |bc &>> error.log

将标准输出和标准输入追加重定向到 delimiter:

<< delimiter
here-document
delimiter

从当前 shell 读取输入源,直到遇到一行只包含 delimiter 终止,内容作为标准输入。将 eof 标准输入作为 cat 标准输出再写到 a.txt:

# cat << eof
123
abc
eof
123
abc
# cat > a.txt << eof
> 123
> abc
> eof

重定向到空设备

/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

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 第一个字符退出
-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://loadingok.com/2184.html
© 2021 京ICP备2021027871号-1
联系我们

联系我们

18513870113

在线咨询: QQ交谈

邮箱: 1140136143@qq.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部