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

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

转载声明

本文大量内容系转载自以下文章,有删改,并参考其他文档资料加入了一些内容:

1 文件描述符

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

内核为每个进程维护该进程打开的文件记录表。

文件描述符只适于 Unix、Linux 操作系统。

2 标准输入、输出和错误

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

3 重定向

3.1 符号

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

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

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

3.2 重定向 输出

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

3.2.1 覆盖输出

一般格式:[n]>word

如果 n 没有指定,默认是 1(标准输出)

示例:

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

3.2.2 追加重定向输出

一般格式:[n]>>word

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

示例:

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

3.3 重定向输入

一般格式:[n]<word

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

示例:

  • a.txt 内容作为 grep 输入
    grep “test” --color < a.txt

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

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

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

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

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

示例:

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

3.4.2 追加标准输出和标准错误

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

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

将标准输出和标准标准输入追加重定向到 word:
<<[-]word

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

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

# cat <<eof
123
abc
eof

123
abc

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

3.5 重定向到 空设备

/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

忽略标准输出和错误输出

# echo "1 + 1" |bc >/dev/null 2>&1

4 read 命令

read 命令从标准输入读取,并把输入的内容复制给变量。

命令格式: read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p

在这里插入图片描述
示例:

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

获取用户输入保存到变量:
# 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
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值