在 Linux Shell 中,一切皆文件。包括命令的输入输出,也可以像文件一样进行重定向。本篇讲透所有输入输出重定向操作符,让你写 Shell 脚本更高效更稳定!
shell学习·思维导图
https://zhimap.com/medit/c2c90a5416714b71a2d81a4b9dc3be17
一、标准输入输出基础概念
类型 | 文件描述符 | 默认流向 |
---|---|---|
标准输入(stdin) | 0 | 键盘输入 |
标准输出(stdout) | 1 | 屏幕终端输出 |
标准错误(stderr) | 2 | 屏幕终端输出 |
📌 **注意:**标准输出(1)和标准错误(2)默认都输出到终端,但我们可以通过重定向,分别输出到文件或丢弃。
二、输入重定向 <
输入重定向(Input Redirection) 是指将命令的标准输入从默认的键盘输入改为来自文件或其他输入源的过程。在 Shell 脚本或命令行中,使用 <
操作符可以实现输入重定向,使得命令可以从指定的文件读取输入而不是等待用户的键盘输入。
语法:
命令 < 输入文件
示例:
有一个bash脚本read_name.sh
#!/bin/bash
echo "请输入你的名字:"
read name
echo "你好,$name"
直接执行脚本,终端会提示输入,如果使用输入重定向,将input.txt
文件中的内容重定向到终端上,就是相当于文件中的内容代替了你手动输入
有一个input.txt
文件内容是人间太岁神·武松
常用于配合 read
、cat
、sort
等命令从文件读取输入。
操作符 | 用途 |
---|---|
< | 将文件内容作为命令的标准输入 |
<< | Here Document,用于多行输入 |
<<< | Here String,用于单行字符串输入 |
<<
和<<<
我们后边的内容会讲到,不要着急!
三、输出重定向 >
(覆盖)、>>
(追加)
>
覆盖输出(若文件存在会被清空)
#终端执行
echo "outpot.txt文件中的内容将会被覆盖" > output.txt
output.txt
文件内容将变成:
如果 output.txt 文件 存在:
文件原有的内容会被 清空(删除),然后写入新的内容:“output.txt
文件中的内容将会被覆盖”
警告:原有数据将永久丢失,不可恢复。
如果 output.txt 文件 不存在:
Shell 会自动创建一个名为 output.txt
的新文件,然后把字符串 “output.txt
文件中的内容将会被覆盖” 写入进去。
>>
追加输出(不会覆盖原内容)
echo "追加输出" >> output.txt
output.txt
文件变成:
outpot.txt文件中的内容将会被覆盖
追加输出
常用于记录日志:echo "日志内容" >> log.txt
四、错误输出重定向 2>
(错误流)
标准错误(stderr)默认和标准输出一样输出到屏幕,但我们可以单独将它重定向。
示例:
ll not_exist_dir 2> error.log
error.log
内容:
- 如果
not-exist-file.txt
不存在,grep
会报错。 - 报错信息(如
No such file or directory
)会被写入error.log
文件中,而不是显示在终端上。
ls: 无法访问not_exist_dir: 没有那个文件或目录
💡 注意:2>
是将 错误输出 重定向,而 >
是将 标准输出 重定向。
五、同时重定向标准输出与错误输出
&>
:同时将标准输出和标准错误都重定向到同一文件(Bash 特有)
同时处理标准输出和标准错误输出
command > output.log 2> error.log
#正常输出写入 output.log
#错误输出写入 error.log
💡 高级技巧:将stdout
和stderr
都写入同一个文件
cat read_name.sh >> all_output.log 2>&1
sh error.log >> all_output.log 2>&1
cat all_output.log
-
把标准输出写入
all_output.log
-
2>&1
表示让标准错误输出也发送到标准输出的位置(即同一个文件)
六、/dev/null 的作用(黑洞设备)
/dev/null
是 Linux 中的“黑洞”,重定向到它的内容会被丢弃。
仅丢弃输出:
command > /dev/null
丢弃错误:
command 2> /dev/null
完全静默运行命令(什么都不显示):
command > /dev/null 2>&1
示例:
ping -c 1 www.baidu.com > /dev/null 2>&1
什么都不会输出,适合脚本中安静执行命令。
重定向汇总表
符号 | 作用 |
---|---|
< | 输入重定向 |
> | 输出重定向(覆盖) |
>> | 输出重定向(追加) |
2> | 错误输出重定向 |
2>> | 错误输出追加 |
2>&1 | 将错误输出合并到标准输出 |
&> | 同时将标准输出和错误输出重定向到文件(Bash) |
/dev/null | 丢弃输出或错误 |
内容学习一个小脚本希望对你有用
递归查询输入目录下的所有子目录和文件,并按照类型(目录、文件、其他)分类输出
下一步推荐文章:
《Shell 脚本语法大全 · 第 5 篇:多命令顺序执行方式》
点赞 + 收藏 + 关注,持续更新《Shell 脚本从入门到实战》系列文章,帮你掌握自动化的核心技能!