惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
The GitHub Blog
The GitHub Blog
J
Java Code Geeks
Engineering at Meta
Engineering at Meta
N
Netflix TechBlog - Medium
A
About on SuperTechFans
博客园 - 三生石上(FineUI控件)
罗磊的独立博客
MongoDB | Blog
MongoDB | Blog
B
Blog RSS Feed
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
有赞技术团队
有赞技术团队
T
Tailwind CSS Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
Vercel News
Vercel News
腾讯CDC
博客园 - 聂微东
The Cloudflare Blog
F
Fortinet All Blogs
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
Visual Studio Blog
Last Week in AI
Last Week in AI
B
Blog

lvbibir's Blog

shell | 磁盘空间分析脚本 python | 使用 uv 管理你的 python 环境 Claude Code 完整配置指南 windows | mihomo 内核独立部署指南 linux | 磁盘扩容 wsl | 释放长久运行占用的磁盘空间 mysql | 线程上限问题处理 麒麟 7.6 安装谷歌 OTP 认证模块 suse 12sp5 升级 openssh 及 openssl suse 12sp5 部署 mysql 5.7 《谁的青春不迷茫》 docker | centos7 部署 docker vim | 基础配置和使用 windows | rime 输入法 & 雾凇方案 shell | sshpass 批量传输文件及执行命令 wsl | 原生 linux 方式安装 docker nodejs | fnm + pnpm 开发环境配置 wsl | 安装配置 miniconda 虚拟环境 wsl | 自动更新系统代理 wsl | bashrc 环境变量不正确加载的处理方法 wsl | win10 安装 wsl2 troubleshooting | ssh 成功但是 scp 失败 linux | 常用命令总结 docker 部署 piclist shell | 检测网站存活并自动钉钉告警 Zabbix | 监控端口连通性并自动追踪 TCP 路由 windows | 自定义开机快速启动项 windows | miniconda 配置 python 虚拟环境 Zabbix | 监控主机到指定 ip 的流量大小 shell | centos 初始化
Linux cat 和 tee 命令写入文件
lvbibir · 2026-01-13 · via lvbibir's Blog

0 前言

在 Linux 系统中, cat 和 tee 命令是处理文件内容的常用工具. 本文详细介绍这两个命令写入文件的各种方式, 特别是 heredoc 语法中 EOF 引号和连字符的作用.

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 系统中处理文件内容, 选择最适合场景的方法是关键 ฅ’ω’ฅ