你有没有遇到过这种情况:想往文件里写一行字,用 cat 试了半天没反应;或者想看文件内容,却顺手敲了 echo,结果屏幕上只出现了文件的路径本身——然后你一脸懵?
cat 和 echo 是 Linux 里用得最频繁的两个命令,新手几乎每天都在用,但它们之间的区别,真正能说清楚的人不多。这篇文章用最直白的方式,把这两个命令彻底讲透。
echo:嘴巴,只管"说话"
echo 做的事很单纯:把你给它的内容,原封不动地打印出来。
echo "Hello, Linux"
# 输出:Hello, Linux
它最擅长的是输出字符串和变量:
echo $HOME
# 输出:/home/xiong
echo "当前用户是:$USER"
# 输出:当前用户是:xiong
你可以把 echo 理解成一个复读机——你说什么,它就重复什么。它不关心磁盘上有没有文件,它只负责"开口说话"。
加上重定向符号,它也能把话"写"到文件里:
echo "第一行内容" > notes.txt # 创建(或覆盖)文件
echo "第二行内容" >> notes.txt # 追加到文件末尾
这是新手最常用的建文件方式,简单粗暴,一行搞定。
cat:搬运工,专门处理文件
cat 的全名是 concatenate(拼接),它的本职工作是读取文件内容,输出到屏幕,或者把多个文件拼成一个。
cat notes.txt
# 输出 notes.txt 里的全部内容
如果你给 cat 两个文件,它会把两个文件的内容顺序拼接起来打印:
cat file1.txt file2.txt
# 先输出 file1 的内容,再输出 file2 的内容
加上重定向,就可以把两个文件合并成一个:
cat file1.txt file2.txt > merged.txt
这就是 cat 名字里"concatenate"的来源——它天生是个文件搬运工,不关心你要写什么字符串,只管搬文件里已有的内容。
核心区别:输入源不一样
这是最关键的一句话,记住了以后就不会再混:
echo 的输入是"你键盘上打的字";cat 的输入是"磁盘上的文件"。
举个反例,新手很容易犯这个错误:
# 错误:想打印变量内容,却用了 cat
cat $HOME
# 报错:cat: /home/xiong: Is a directory
# 因为 cat 把 $HOME 的值当成了文件路径去找文件了
正确做法当然是 echo $HOME。
不同场景,该用谁?
场景一:往文件写一行简单的文字
用 echo,快准狠。
echo"export PATH=$PATH:/usr/local/bin" >> ~/.bashrc
这是往 .bashrc 里追加环境变量的经典操作,三秒搞定。
场景二:往文件写多行内容(Heredoc)
如果要写的内容超过一行,echo 就开始显得笨拙了。这时候该轮到 cat 配合 Heredoc 语法登场:
cat > config.conf << 'EOF'
[server]
host = 127.0.0.1
port = 8080
debug = true
EOF
<< 'EOF' 是一个"内容块"标记,从这一行到下一个 EOF 之间的所有内容,都会被写进文件。这种写法在自动化脚本里非常常见,比用多个 echo 优雅得多。
场景三:查看文件内容
毫无疑问,cat。
cat /etc/os-release # 查看系统版本
cat ~/.ssh/id_rsa.pub # 查看 SSH 公钥
如果文件很长,可以搭配 -n 显示行号,方便定位:
cat -n long_script.sh
场景四:合并多个日志文件
cat 的拿手好戏:
cat access_2025_01.log access_2025_02.log access_2025_03.log > access_Q1.log
三个月的日志,一条命令合并完毕。echo 在这个场景完全帮不上忙。
场景五:Shell 脚本调试
在脚本里插入调试信息,echo 是标配:
#!/bin/bash
echo"开始执行备份任务..."
rsync -av /data /backup
echo"备份完成,退出码:$?"
echo 像是脚本里的"print 语句",随手插,随手删,调试神器。
场景六:从键盘手动输入内容到文件
cat 还有一个冷门用法——不接文件名时,它会从键盘读取输入:
cat > memo.txt
# 此时终端等待输入,你打的所有内容都会写进文件
# 输完按 Ctrl+D 结束
这个用法适合临时记录一小段内容,比打开编辑器快,比写 echo 省事(尤其是内容里有引号的时候不用转义)。
一个常见误区:cat 创建文件 vs echo 创建文件
有人喜欢用 cat /dev/null > file.txt 来清空文件,有人用 echo -n > file.txt,其实最简洁的方式是:
> file.txt # 直接用重定向,最干净
三种方式效果一样,但明白背后的逻辑,才不会在脚本里写出让同事看不懂的代码。
总结
cat 和 echo 分工明确,互不越界:
- • 要读取文件、合并文件、写多行内容 →
cat(配合 Heredoc)
记住那句核心区别:“echo 说话,cat 搬文件”,两者就再也不会混淆。