说实话,我第一次在Linux里用lpr打印文件的时候,是被同事“教育”过的——他在终端敲了一行命令,办公室那台老打印机就吐出了一份报表,而我还在翻菜单找打印按钮。这让我意识到,Linux下打印的便利性从来不在图形界面里,而在命令行。lpr就是那个从命令行提交文件到打印机打印的命令,别小看它,至今在服务器、脚本和自动化场景里,它依然是很多打印任务的第一入口。
这篇文章就把lpr怎么用、有哪些实用选项、怎么配合打印队列管理、以及我实际踩过的各种坑,完整梳理一遍。适合系统管理员、运维工程师,以及任何需要在无图形界面环境里处理打印任务的人。无论你用的是Ubuntu、Debian、CentOS还是macOS,只要底子是Unix/Linux,lpr这套逻辑基本通用。
1. 为什么现在还值得学lpr:从管道打印说起
1.1 一个服务器上的真实场景
我最早大量使用lpr,是在一台没有桌面环境的服务器上。当时的需求很朴素:每周要交一份网络设备巡检记录,但机器上既没有WPS也没有图形化打印管理,唯一能把结果变成纸质文档的方式,就是把巡检脚本的最终输出直接送进打印机。
当时我遇到的场景是这样的:巡检脚本跑完之后,会生成一个/tmp/check_result.txt,里面是设备状态、端口状态、链路流量之类的文本摘要。我需要把这个文件打印出来归档。在没有lpr之前,我得把文件下载到本地电脑,再打开、再选打印机、再点打印——来回折腾五分钟。而用lpr的话:
bash复制lpr /tmp/check_result.txt
一行命令,打印机直接把文件打出来了。后来我甚至把这一步直接写进了巡检脚本末尾,跑完自动打印,连手动操作都省了。
1.2 lpr到底做了什么:提交、队列、后台的三角关系
要理解lpr,得先理解Unix打印系统的基本模型。打印不是“命令直接把数据发给打印机硬件”,而是有一条完整的链路:
- 提交:lpr把文件或标准输入数据提交给打印队列。
- 排队:打印系统后台守护进程(如CUPS的cupsd)把任务挂到对应打印机的队列里。
- 产出:后台进程按顺序处理任务,调用过滤器、驱动,最终把数据发到打印机物理设备。
所以lpr的核心动作只有一个:把数据“扔”给打印系统。至于数据怎么变成纸上的内容,那是过滤器、驱动和后台守护进程的事,lpr本身不关心。理解了这个模型,你就能明白为什么lpr有很多-o选项——因为队列里的后续环节需要知道“用什么纸、打几份、横打还是竖打”。
1.3 到底适合谁来学
lpr的适用人群,明显比图形界面打印工具更窄,但场景更硬核:
- 服务器管理员:机器没有图形界面,只能通过终端管理打印。
- 脚本自动化场景:报表生成、日志归档、批量打印,需要把打印动作嵌入到Shell脚本或定时任务里。
- 远程运维:通过SSH连到远程主机,想用远程打印机输出文档。
- 日常习惯命令行的人:一条
lpr能解决的事,就不想打开文件管理器。
哪怕你平时主要用图形界面,我也建议掌握lpr的基本用法,因为在排查打印问题时,命令行能给你的信息远比“打印机无响应”这个弹窗多得多。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. lpr的基础操作:文件、管道与打印机选择
2.1 最直接的用法:lpr加文件名
最基础也是最常见的用法,就是把文件路径直接跟在lpr后面:
bash复制lpr report.txt
lpr /home/user/document.pdf
lpr /path/to/photo.jpg
一次提交多个文件也是支持的,命令会把这些文件按顺序当成同一个打印任务处理:
bash复制lpr file1.txt file2.txt file3.txt
这里的文件类型没有硬性限制。文本文件、PDF、PostScript、图片都可以,但能不能正确打印,取决于系统里有没有对应的过滤组件。比如打印PDF依赖cups-filters和poppler-utils,如果缺了,打印机出来的可能就是一堆乱码或者空白页。这个坑我后面专门讲。
还有一个小细节:文件名里有中文时,大部分情况能正常工作,但在一些老旧的打印队列配置下可能会出现处理异常。我的习惯是先把它改成英文文件名再打印,省得排查问题的时候多个变量。
命令执行完没有任何输出,通常代表提交成功。你可以紧接着用lpstat查看队列状态来确认:
bash复制lpstat -p -d
2.2 管道打印:命令输出直接上纸
lpr最有魅力的地方,是它能从标准输入读取数据。这意味着任何命令的输出,都可以直接变成打印内容,不需要先落盘再打印。这是命令行打印的核心竞争力,图形界面反而做不到这么顺滑。
来看几个例子:
bash复制cat /etc/hosts | lpr
ps aux | lpr
echo "这是测试页" | lpr
这背后是Unix管道机制在起作用。你写完cat /etc/hosts | lpr之后,cat的输出不会显示在屏幕上,而是作为标准输入被lpr接收,lpr再把它送进打印队列。
我记得有一次领导临时要一份php配置文件的纸质版用于评审,我直接敲了:
bash复制cat /etc/php/8.1/cli/php.ini | lpr -P office-printer
十秒钟后
