目录
在Unix/Linux Shell脚本中,输入/输出重定向(Input/Output redirection)是一种非常强大的功能,允许你改变程序的标准输入(stdin)、标准输出(stdout)和标准错误输出(stderr)的目标。通过重定向,你可以将程序的输出发送到文件而不是屏幕,或者将文件的内容作为程序的输入而不是键盘输入。以下是对输入/输出重定向的基础介绍及其使用方法。
1. 标准输入/输出/错误流
- 标准输入(stdin):默认从键盘读取输入,文件描述符为0。
- 标准输出(stdout):默认输出到终端屏幕,文件描述符为1。
- 标准错误(stderr):默认输出到终端屏幕,文件描述符为2。
2. 基本重定向
输出重定向 <
和 >
<
用于将文件内容作为程序的标准输入。>
用于将程序的标准输出重定向到一个文件。
示例:
bash
深色版本
1# 将文件内容作为程序的输入
2wc < input.txt
3
4# 将程序的输出重定向到文件
5ls > files.list
输入重定向 <
的变体 <<
<<
用于将内联文本作为程序的标准输入。
示例:
bash
深色版本
1# 使用内联文本作为输入
2cat <<EOF > output.txt
3This is a multi-line string.
4It can span multiple lines.
5EOF
输出重定向 >
>
用于覆盖现有文件或创建新文件。>>
用于追加到现有文件或创建新文件。
示例:
bash
深色版本
1# 覆盖文件
2echo "Overwriting file." > file.txt
3
4# 追加到文件
5echo "Appending to file." >> file.txt
3. 错误重定向 2>
2>
用于将标准错误输出重定向到文件。
示例:
bash
深色版本
1# 将错误输出重定向到文件
2ls /nonexistent/directory 2> errors.log
4. 合并标准输出和标准错误 &>
&>
用于同时重定向标准输出和标准错误到同一个文件。
示例:
bash
深色版本
1# 同时重定向标准输出和标准错误
2ls /nonexistent/directory &> combined.log
5. 文件描述符重定向 <()
和 >(...)
<()
用于将命令的输出作为程序的标准输入。>(...)
用于将程序的输出重定向到一个命令。
示例:
bash
深色版本
1# 使用命令的输出作为输入
2wc <(echo "Hello"; echo "World")
3
4# 将输出通过管道传递给另一个命令
5echo "Hello" >(tee -a log.txt | sed 's/H/h/')
6. 重定向和管道的组合使用
重定向可以与管道一起使用,以实现更复杂的输入/输出流控制。
示例:
bash
深色版本
1# 通过管道将输出重定向到文件
2ls | grep "txt" > txtfiles.list
3
4# 从文件读取输入并通过管道处理
5cat input.txt | sort > sorted.txt
7. 重定向与脚本调试
重定向对于调试脚本也非常有用,你可以将标准输出和标准错误分开记录,以便更容易分析问题所在。
示例:
bash
深色版本
1# 分别记录标准输出和标准错误
2command > stdout.log 2> stderr.log
8. 使用 exec
重新定义标准流
exec
命令可以用来永久地重新定义标准输入、输出或错误流。
示例:
bash
深色版本
1# 重新定义标准输出
2exec > logfile.txt
3echo "This message goes to the log file."
4
5# 重新定义标准输入
6exec < input.txt
7cat # Reads from input.txt instead of keyboard
8
9# 重新定义标准错误
10exec 2> errors.log
11echo "An error occurred." >&2
总结
通过输入/输出重定向,你可以更加灵活地控制程序的数据流向,这对于脚本编写和系统管理都非常有用。掌握了这些基本概念后,你可以根据需要设计复杂的重定向方案,以满足特定的需求。