Appearance
标准输入输出
标准流
标准输入(stdin)
bash
#!/bin/bash
# 从标准输入读取
echo "请输入你的名字:"
read name
echo "你好, $name!"标准输出(stdout)
bash
#!/bin/bash
# 输出到标准输出
echo "Hello, World!"
printf "Hello, %s!\n" "World"标准错误(stderr)
bash
#!/bin/bash
# 输出到标准错误
echo "错误信息" >&2重定向
输出重定向
bash
#!/bin/bash
# 覆盖输出到文件
echo "Hello, World!" > output.txt
# 追加输出到文件
echo "Hello, World!" >> output.txt输入重定向
bash
#!/bin/bash
# 从文件读取输入
while read line; do
echo "$line"
done < input.txt错误重定向
bash
#!/bin/bash
# 重定向错误输出
ls /nonexistent 2> error.txt
# 重定向错误输出到标准输出
ls /nonexistent 2>&1组合重定向
bash
#!/bin/bash
# 标准输出和错误输出都重定向到文件
ls /nonexistent > output.txt 2>&1
# 标准输出和错误输出分别重定向
ls /nonexistent > output.txt 2> error.txt文件描述符
自定义文件描述符
bash
#!/bin/bash
# 打开文件描述符 3 用于写入
exec 3> output.txt
# 写入文件描述符 3
echo "Hello, World!" >&3
# 关闭文件描述符 3
exec 3>&-读取文件描述符
bash
#!/bin/bash
# 打开文件描述符 3 用于读取
exec 3< input.txt
# 从文件描述符 3 读取
while read -u 3 line; do
echo "$line"
done
# 关闭文件描述符 3
exec 3<&-实用示例
示例1:日志记录
bash
#!/bin/bash
# 日志文件
log_file="app.log"
# 重定向标准输出和错误输出到日志文件
exec > >(tee -a "$log_file")
exec 2>&1
echo "程序启动"
echo "处理数据..."
echo "程序完成"示例2:读取配置文件
bash
#!/bin/bash
# 配置文件
config_file="config.conf"
# 从配置文件读取
while read -r line; do
# 跳过注释和空行
[[ "$line" =~ ^#.*$ ]] && continue
[[ -z "$line" ]] && continue
# 处理配置
echo "配置: $line"
done < "$config_file"示例3:处理输出
bash
#!/bin/bash
# 捕获命令输出
output=$(ls -l)
echo "$output"
# 处理命令输出
ls -l | while read -r line; do
echo "$line"
done示例4:错误处理
bash
#!/bin/bash
# 错误日志文件
error_log="error.log"
# 重定向错误输出到日志文件
exec 2> "$error_log"
# 执行命令
ls /nonexistent
# 检查错误日志
if [ -s "$error_log" ]; then
echo "发生错误:"
cat "$error_log"
fi最佳实践
1. 使用重定向
bash
# 好的做法
echo "Hello, World!" > output.txt
# 不好的做法
echo "Hello, World!" | cat > output.txt2. 错误处理
bash
# 好的做法
command 2> error.txt
# 不好的做法
command3. 文件描述符管理
bash
# 好的做法
exec 3> output.txt
echo "Hello" >&3
exec 3>&-
# 不好的做法
exec 3> output.txt
echo "Hello" >&3总结
标准输入输出的关键点:
- 标准流:stdin、stdout、stderr
- 输出重定向:
>、>> - 输入重定向:
< - 错误重定向:
2>、2>&1 - 文件描述符:自定义文件描述符
- 最佳实践:合理使用重定向,处理错误,管理文件描述符
下一节我们将学习 echo 命令的使用。