Shell标准输入、输出和错误的示例分析
admin
2023-08-01 06:40:19
0

文件描述符(fd):文件描述符是一个非负整数,在打开现存文件或新建文件时,内核会返回一个文件描述符,读写文件也需要使用文件描述符来访问文件。

内核为每个进程维护该进程打开的文件记录表。文件描述符只适于Unix、Linux操作系统。

8.1 标准输入、输出和错误

文件描述符

描述

映射关系

0

标准输入,键盘

/dev/stdin ->  /proc/self/fd/0

1

标准输出,屏幕

/dev/stdout ->  /proc/self/fd/1

2

标准错误,屏幕

/dev/stderr ->  /proc/self/fd/2

8.2 重定向符号

符号

描述

符号左边输出作为右边输入(标准输出)

>> 

符号左边输出追加右边输入

符号右边输出作为左边输入(标准输入)

<< 

符号右边输出追加左边输入

&

重定向绑定符号

输入和输出可以被重定向符号解释到shell。

shell命令是从左到右依次执行命令。

下面n字母是文件描述符。

8.3 重定向输出

1)覆盖输出

一般格式:[n]>word

如果n没有指定,默认是1

示例:

打印结果写到文件:echo "test" > a.txt

当没有安装bc计算器时,错误输出结果写到文件:echo "1 + 1" |bc2 > error.log

2)追加重定向输出

一般格式:[n]>>word

如果n没有指定,默认是1

示例:

打印结果追加到文件:echo "test" >> a.txt

当没有安装bc计算器时,错误输出结果追加文件:echo "1 + 1" |bc2 > error.log

8.4 重定向输入

一般格式:[n]

如果n没有指定,默认是0

示例:

a.txt内容作为grep输入:grep "test" --color < a.txt   

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

1)覆盖重定向标准输出和标准错误

两种格式重定向标准输出和标准错误:

&>word和>&word 等价于 >word 2>&1  

&将标准输出和标准输入绑定到一起,重定向word文件。

示例:

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

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

2)追加标准输出和标准错误

追加格式:&>>word  等价于>>word2>&1

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

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

<<[-]word

  here-document

delimiter

从当前shell读取输入源,直到遇到一行只包含delimiter终止,内容作为标准输入。

将eof标准输入作为cat标准输出再写到a.txt:

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

8.6 重定向到空设备 

/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群:323779636(Shell/Python运维开发群)

8.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

相关内容

热门资讯

四川宜宾发生4.8级地震,震源... 中国地震台网正式测定:07月09日07时44分在四川宜宾市高县(北纬28.51度,东经104.68度...
特朗普突然换飞机引猜测,伊朗官... 北约峰会7月8日结束后,美国总统特朗普回国时换回了旧的“空军一号”专机。在美伊再度大打出手之际,特朗...
停战备忘录墨迹未干,双方又真刀... 不是我们不明白,是这个世界变化太快。一觉醒来,一群黑天鹅扑腾着就来了。世界总是在用荒诞提醒我们:你能...
“野路子”,不允许了 中国有4亿人玩户外,改变正在发生。最近,莆田刺刀峡谷5人溺亡,泰山架设135公里“刀片网”——两则新...
特朗普:美国尊重中国 【文/观察者网 冯雪】据南华早报7月9日报道,在土耳其举行的北约峰会期间,美国总统特朗普先是表示,上...
龙卷风横扫湖北小镇的2分钟:大... 7月6日傍晚,22岁的周南(化名)骑着电动自行车出门,打算去不远的朋友家借本书。他抬头看了眼阴沉的天...
人民日报:让“文字游戏”式广告... 让“文字游戏”式广告得不偿失(金台锐评)倪 弋《人民日报》(2026年07月09日 第 19 版)引...
特朗普就美军再次袭击伊朗发声 当地时间7月8日晚,美国总统特朗普离开土耳其抵达英国。 他就正在对伊朗进行的打击行动表示,这是“对伊...
美伊再交火,联合国秘书长发声 新华社联合国7月8日电(记者尚绪谦)联合国秘书长古特雷斯的发言人迪雅里克8日表示,古特雷斯对美国和伊...
伊朗将大规模打击美军基地 当地时间今天(7月9日)凌晨,据伊朗努尔新闻网援引一名军方消息人士的话报道,伊朗武装部队导弹部队和无...