Linux下Shell标准输入、输出和错误

本文深入探讨了Unix/Linux环境下Shell的标准输入、输出和错误处理,详细解析了重定向符号的功能与应用,包括覆盖和追加重定向、输入重定向、标准输出与错误的综合处理,以及重定向到空设备的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Shell标准输入、输出和错误

大多数 Unix、Linux 操作系统命令从你的终端接受输入并将所产生的输出发送回到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。

1、标准输入、输出和错误

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

2、重定向符号

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

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

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

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

3、重定向输出

1)覆盖输出

一般格式:[n]>word
如果n没有指定,默认是1

示例: 

打印结果写到文件:

[root@ chenc01 ~]# echo "test" > a.txt

当没有安装bc计算器时,错误输出结果写到文件:

[root@ chenc01 ~]# echo "1 + 1" |bc 2 > error.log

2)追加重定向输出

一般格式:[n]>>word

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

示例:

打印结果追加到文件:

[root@ chenc01 ~]# echo "test" >> a.txt

当没有安装bc计算器时,错误输出结果追加文件:

[root@ chenc01 ~]# echo "1 + 1" |bc 2 > error.log

4、重定向输入

一般格式:[n]<word

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

示例: 
a.txt内容作为grep输入:
[root@ chenc01 ~]# grep "test" --color < a.txt  

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

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

&>word和>&word 等价于 >word 2>&1  
&将标准输出和标准输入绑定到一起,重定向word文件。

示例:

当不确定执行对错时都覆盖到文件:

[root@ chenc01 ~]# echo "1 + 1" |bc &> error.log

当不确定执行对错时都覆盖到文件:

[root@ chenc01 ~]# echo "1 + 1" |bc > error.log 2>&1

2)追加重定向标准输出和标准错误

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

示例:

当不确定执行对错时都追加文件:

[root@ chenc01 ~]# echo "1 + 1" |bc &>> error.log

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

<< delimiter
  here-document
delimiter

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

[root@ chenc01 ~]# cat << eof
123
abc
eof
123
abc

[root@ chenc01 ~]# cat > a.txt << eof
\> 123
\> abc
\> eof

6、重定向到空设备

/dev/null是一个空设备,向它写入的数组都会丢弃,但返回状态是成功的。与其对应的还有一个/dev/zero设备,提供无限的0数据流。
在写Shell脚本时我们经常会用到/dev/null设备,将stdout、stderr输出给它,也就是我们不想要这些输出的数据。
通过重定向到/dev/null忽略输出,比如我们没有安装bc计算器,正常会抛出没有发现命令:

[root@ chenc01 ~]# echo "1 + 1" |bc >/dev/null 2>&1

这就让标准和错误输出到了空设备。

忽略标准输出:
[root@ chenc01 ~]# echo "test" >/dev/null

忽略错误输出:
[root@ chenc01 ~]# echo "1 + 1" |bc 2>/dev/null

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第一个字符退出
-n nchars读取nchars个字符返回,而不是等到换行符
-p prompt提示信息
-t timeout等待超时时间,秒
-u fd指定文件描述符号码作为输入,默认是0
name变量名
示例:

获取用户输入保存到变量:

[root@ chenc01 ~]# read -p "Please input your name: " VAR
Please input your name: lizhenliang

[root@ chenc01 ~]# echo $VAR
lizhenliang

用户输入保存为数组:
[root@ chenc01 ~]# read -p "Please input your name: " -a ARRAY
Please input your name: a b c

[root@ chenc01 ~]# echo ${ARRAY[*]}
a b c

遇到e字符返回:
[root@ chenc01 ~]# read -d e VAR
123
456
e

[root@ chenc01 ~]# echo $VAR
123 456

从文件作为read标准输入:
[root@ chenc01 ~]# cat a.txt
adfasfd
[root@ chenc01 ~]# read VAR < a.txt
[root@ chenc01 ~]# echo $VAR
adfasfd

while循环读取每一行作为read的标准输入:
[root@ chenc01 ~]# cat a.txt |while read LINE; do echo $LINE; done
123
abc

分别变量赋值:
[root@ chenc01 ~]# read a b c
1 2 3

[root@ chenc01 ~]# echo $a
1

[root@ chenc01 ~]# echo $b
2

[root@ chenc01 ~]# echo $c
3

[root@ chenc01 ~]# echo 1 2 3 | while read a b c;do echo "$a $b $c"; done
1 2 3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值