Skip to content

标准输入输出

标准流

标准输入(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.txt

2. 错误处理

bash
# 好的做法
command 2> error.txt

# 不好的做法
command

3. 文件描述符管理

bash
# 好的做法
exec 3> output.txt
echo "Hello" >&3
exec 3>&-

# 不好的做法
exec 3> output.txt
echo "Hello" >&3

总结

标准输入输出的关键点:

  1. 标准流:stdin、stdout、stderr
  2. 输出重定向>>>
  3. 输入重定向<
  4. 错误重定向2>2>&1
  5. 文件描述符:自定义文件描述符
  6. 最佳实践:合理使用重定向,处理错误,管理文件描述符

下一节我们将学习 echo 命令的使用。