write 是一个用于在 Linux/Unix 系统中进行实时文本通信的命令行工具,它的主要功能是向另一个登录到同一台主机的用户发送消息。

基本概念
write 命令的工作原理非常直接:
- 你(发送方)运行
write命令,指定接收方的用户名。 - 系统会检查该用户是否已登录,以及是否允许接收消息。
- 如果一切正常,接收方的终端会立即显示你输入的消息,直到你结束输入。
- 接收方可以使用
write命令回复你,从而实现双向的实时对话。
重要前提: 发送方和接收方必须登录到同一台物理或虚拟主机上。write 命令不能通过网络发送消息给另一台机器上的用户(除非使用 write user@hostname 这种不常见的用法,但通常有更好的工具如 talk 或 mesg)。
语法
write user [ttyname]
参数说明:
user: 必需参数,你要发送消息的用户的登录名。ttyname: 可选参数,如果该用户登录了多个终端(会话),你需要指定具体的终端设备名,pts/0或tty1,如果不指定,write会默认发送到该用户的当前活动终端。
使用示例
示例 1:基本用法
假设你的用户名是 alice,你想给登录在同一台主机上的用户 bob 发送消息。

-
在
alice的终端输入:write bob
输入此命令后,你的终端会进入输入模式,光标会移到新行的开头。
-
输入消息:
Hi Bob, this is Alice. Are you busy? (按 Enter 换行) I have a quick question about the project. (按 Ctrl + D 结束输入)
Ctrl + D是文件结束符(EOF),用它来告诉write命令你的消息已经输入完毕。
-
在
bob的终端查看:bob的终端屏幕上会立刻显示出类似下面的内容(可能会根据终端设置有所不同):
(图片来源网络,侵删)Message from alice on pts/1 at 10:30 ... Hi Bob, this is Alice. Are you busy? I have a quick question about the project.bob现在可以立即用write alice回复你。
示例 2:指定终端
bob 同时开了两个 SSH 会话,分别在 pts/0 和 pts/1 上,你想只给他 pts/1 的会话发送消息:
# 在 alice 的终端 write bob pts/1
这样,消息就只会显示在 bob 的 pts/1 终端上。
示例 3:与不在线的用户通信
如果你尝试给一个没有登录的用户发送消息,系统会提示你:
write non_existent_user write: non_existent_user has messages disabled
或者
write non_existent_user write: non_existent_user: pts/0
(然后没有响应,因为用户没在线)
相关命令和概念
理解 write 命令,必须了解与之相关的两个命令:mesg 和 talk。
mesg 命令
write 的功能是否生效,取决于接收方是否允许接收消息。mesg 命令就是用来控制这个权限的。
mesg y(yes): 允许其他用户用write给你发消息。这是默认状态。mesg n(no): 禁止其他用户用write给你发消息。
如何检查当前状态?
使用 mesg 命令不带任何参数:
$ mesg is y # 或者 $ mesg is n
is y,表示允许;is n 表示禁止。
实用技巧: 如果你不希望被别人打扰,可以在自己的终端执行:
mesg n
这样,任何试图用 write 给你发消息的人都会收到 "messages disabled" 的错误提示。
talk 命令
write 是一种半双工通信(你一句,我一句),而 talk 是一种全双工通信工具,它会把屏幕分成上下两个区域,你可以在自己的区域输入,对方的输入会实时显示在他的区域,实现类似即时聊天的效果。
talk 的用法和 write 类似,但体验更好:
talk bob
talk 会尝试与对方建立连接,如果成功,双方屏幕都会被分割,开始实时对话。
注意事项和最佳实践
-
礼貌性:在发送消息前,最好先用
write命令本身打个招呼,或者先用who或w命令看看对方是否在线,直接发长篇大论可能会吓到对方。# 先打个招呼 write bob Bob, are you there? (^D to end) # 或者先检查 w # 查看输出,确认 bob 确实在线
-
打扰问题:
write会直接在对方的终端上输出内容,非常具有“侵入性”,可能会打断对方正在执行的命令或编辑的文件,只在必要时使用,并遵循“先打招呼”的原则。 -
现代替代品:
- 对于现代 Linux/Unix 系统,
write和talk使用得已经越来越少。 - 即时通讯工具:如 Slack、Microsoft Teams、Discord 等是团队协作和即时通信的首选。
- 系统内消息:
wall(write all) 命令可以向所有在线用户广播消息(通常由 root 用于系统维护通知)。 - 终端多路复用器:
tmux或screen允许你在一个终端窗口内创建多个会话,并可以在会话间聊天,是开发者非常喜爱的工具。
- 对于现代 Linux/Unix 系统,
总结表格
| 命令 | 功能 | 示例 | 备注 |
|---|---|---|---|
write |
向同一主机的指定用户发送单行或多行消息。 | write bob |
半双工,直接在对方终端显示。 |
mesg |
控制是否接收 write 发来的消息。 |
mesg n |
y 允许,n 禁止,默认为 y。 |
talk |
与同一主机的用户进行全双工实时对话。 | talk bob |
屏幕分割,体验类似聊天软件。 |
wall |
向所有登录用户广播消息。 | wall System will reboot at 2 AM |
需要root权限,通常用于系统通知。 |
w / who |
查看当前在线的用户及其终端信息。 | w |
在使用 write 前先检查对方是否在线。 |
希望这份详细的解释能帮助你完全理解 write 命令!
