0 前言
在 Linux 系统中, cat 和 tee 命令是处理文件内容的常用工具. 本文详细介绍这两个命令写入文件的各种方式, 特别是 heredoc 语法中 EOF 引号和连字符的作用.
1 cat 命令写入文件
cat 命令可以通过重定向操作符将内容写入文件:
# 覆盖写入
cat > filename
# 追加写入
cat >> filename
2 tee 命令写入文件
tee 命令可以同时将输出写入文件和显示在终端:
# 覆盖写入
echo "内容" | tee filename
# 追加写入
echo "内容" | tee -a filename
3 heredoc 语法详解
heredoc (Here Document) 是一种在 shell 中处理多行文本的强大语法, 可以与 cat 和 tee 命令结合使用.
3.1 基本用法
# 与 cat 结合
cat > file.txt << EOF
这是第一行内容
变量值: $USER
EOF
# 与 tee 结合
tee filename << EOF
这是多行内容
会同时显示在终端和写入文件
EOF
3.2 EOF 引号的作用
不加引号 (默认): 变量和命令会被展开
name="张三"
cat << EOF
用户名: $name
当前目录: $PWD
EOF
加引号 (单引号或双引号): 禁止变量展开, 按字面意思输出
cat << 'EOF'
用户名: $name
当前目录: $PWD
EOF
3.3 EOF 连字符 (-) 的作用
连字符 - 会移除 heredoc 内容行首的制表符 (tab):
# 不使用连字符 - tab 会保留
cat << EOF
这行前面有 tab
EOF
# 使用连字符 - tab 会被移除
cat <<- EOF
这行前面有 tab, 会被移除
EOF
注意: 只移除制表符 (tab), 不移除空格, 且必须是真正的 tab 字符
4 实际应用场景
4.1 创建包含特殊字符的配置文件
# 创建包含 $ 符号的配置文件 (使用引号防止变量展开)
cat > app.conf << 'EOF'
database_url = "mysql://user:$password@localhost/db"
api_key = "$API_SECRET_KEY"
log_format = "${timestamp} ${level} ${message}"
EOF
4.2 在函数中生成配置文件
# 在函数中使用 heredoc (连字符保持代码可读性)
create_nginx_config() {
local domain=$1
local port=$2
if [ -n "$domain" ]; then
cat > "/etc/nginx/sites-available/$domain" <<- EOF
server {
listen $port;
server_name $domain;
root /var/www/$domain;
location / {
try_files \$uri \$uri/ =404;
}
}
EOF
echo "配置文件已创建: $domain"
else
echo "错误: 域名不能为空"
fi
}
# 调用函数
create_nginx_config "example.com" 80
4.3 使用 tee 记录部署日志
# 同时显示在终端和写入日志文件
tee -a deploy.log << EOF
=== 部署开始 ===
时间: $(date '+%Y-%m-%d %H:%M:%S')
用户: $USER
分支: $(git branch --show-current)
提交: $(git rev-parse --short HEAD)
=== 部署结束 ===
EOF
4.4 批量创建文件
# 使用循环和 heredoc 批量创建配置文件
for env in dev test prod; do
cat > "config-${env}.yml" << EOF
environment: $env
database:
host: db-${env}.example.com
port: 5432
redis:
host: redis-${env}.example.com
EOF
done
5 最佳实践
- 简单内容: 使用
echo重定向 - 多行内容: 使用 heredoc
- 同时显示和保存: 使用 tee
- 包含特殊字符: 使用引号包围 EOF
- 避免变量注入: 配置文件使用引号包围 EOF
- 代码可读性: 使用有意义的分隔符名称 (如
DOCKER_COMPOSE而不是EOF)
这些技巧能帮你更高效地在 Linux 系统中处理文件内容, 选择最适合场景的方法是关键 ฅ’ω’ฅ

