Linux Shell 命令的结果主要可以分为两大类:

- 标准输出:命令执行成功后返回的正常信息。
- 标准错误:命令执行失败或遇到问题时返回的错误信息。
还有一个非常重要的概念是 命令的退出状态码,它用数字表示命令的执行成败。
下面我们通过分类和实例来详细解析。
标准输出
这是最常见的结果,即命令成功运行后打印到屏幕上的信息。
文本/列表信息
这类结果直接以可读的文本形式呈现,通常用于查看文件内容、列出目录、查看系统信息等。

-
ls:列出目录内容。$ ls -l total 16 drwxr-xr-x 2 user user 4096 Oct 26 10:30 Documents -rw-r--r-- 1 user user 220 Oct 26 10:30 file.txt
结果:显示了文件和目录的详细信息,如权限、所有者、大小、修改日期和名称。
-
cat:显示文件内容。$ cat file.txt Hello, this is a test file. This is the second line.
结果:直接将
file.txt的内容打印出来。
(图片来源网络,侵删) -
ps:查看当前运行的进程。$ ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.5 12800 5104 ? Ss Oct25 0:01 /sbin/init user 1234 0.0 0.1 9640 896 pts/0 S+ 10:30 0:00 ps aux
结果:一个包含所有进程信息的表格。
二进制数据
有些命令的输出并不是纯文本,而是二进制数据,这些数据通常需要被其他命令或程序处理。
-
tar:打包和解包文件。$ tar -czf my_archive.tar.gz Documents/
结果:这个命令本身没有标准输出,它的“结果”是生成了一个名为
my_archive.tar.gz的新文件,这种“静默执行”是很多命令的设计模式。 -
dd:转换和复制文件。$ dd if=/dev/zero of=testfile bs=1M count=10 10+0 records in 10+0 records out 10485760 bytes (10 MB, 10 MiB) copied, 0.0123456 s, 851 MB/s
结果:输出是操作摘要,显示了复制了多少记录、多少字节以及耗时等信息。
标准错误
当命令执行失败时(文件不存在、权限不足、参数错误等),它会将错误信息输出到“标准错误流”。
-
cat一个不存在的文件$ cat non_existent_file.txt cat: non_existent_file.txt: No such file or directory
结果:
cat命令失败,并打印了一条清晰的错误信息。 -
ls一个没有权限的目录$ ls /root ls: cannot open directory '/root': Permission denied
结果:因为当前用户没有权限访问
/root目录,ls命令失败并报错。
重要提示:默认情况下,标准输出和标准错误都显示在你的终端屏幕上,但它们是两个独立的流,这为我们提供了强大的重定向能力。
退出状态码
这是判断命令是否成功执行的官方、最可靠的方法,每个命令执行结束后,都会返回一个整数值(0-255)。
echo $?:查看上一个命令的退出状态码。0:表示命令成功执行。- 非零值:表示命令执行失败,不同的非零值通常代表不同的错误原因(虽然不是所有命令都遵循统一标准,但
0代表成功是绝对的)。
示例:
$ ls existing_file.txt existing_file.txt $ echo $? 0 # <-- 成功,状态码为0 $ ls non_existent_file.txt ls: cannot access 'non_existent_file.txt': No such file or directory $ echo $? 2 # <-- 失败,状态码为非零(ls命令在文件不存在时通常返回2)
在 Shell 脚本中,我们经常使用状态码来进行流程控制:
if grep "error" /var/log/syslog; then echo "Found an error in the system log!" else echo "No errors found." fi
这里 if 语句就是根据 grep 命令的退出状态码(是否找到匹配行)来决定执行哪个分支的。
如何处理命令结果(重定向和管道)
强大的 Shell 体现在我们可以灵活地处理这些输出结果。
重定向
将命令的输出从屏幕保存到文件中。
-
>:将标准输出覆盖写入文件。$ ls -l > file_list.txt # file_list.txt 的内容会被 ls 的输出完全替换
-
>>:将标准输出追加到文件末尾。$ date >> log.txt # 当前时间被添加到 log.txt 文件的末尾,原有内容保留
-
2>:将标准错误覆盖写入文件。$ ls /root 2> error.log # 错误信息被存入 error.log,屏幕上不显示任何内容
-
&>:将标准输出和标准错误都重定向到同一个文件。$ ls /root &> all_output.log # 无论成功还是失败,所有输出都进入 all_output.log
管道
将一个命令的标准输出直接作为另一个命令的标准输入,这是 Linux 命令行哲学的核心:“Do one thing and do it well.”(做好一件事。)。
- :管道符。
示例:
-
ls+grep:查找当前目录中所有包含 "log" 的文件。$ ls -l | grep log -rw-r--r-- 1 user user 1024 Oct 25 11:30 access.log -rw-r--r-- 1 user user 2048 Oct 26 09:15 error.log
过程:
ls -l的输出没有显示在屏幕上,而是通过管道 传给了grep,grep再从中筛选出包含 "log" 的行并显示。 -
cat+wc:统计一个文件中的行数。$ cat /etc/passwd | wc -l 42
过程:
cat /etc/passwd的输出作为wc -l(统计行数)的输入,最终直接得到数字42。 -
ps+grep+awk:查找名为 "sshd" 的进程的 PID。$ ps aux | grep sshd | grep -v grep | awk '{print $2}' 1234 5678过程:
ps aux列出所有进程。- 传给
grep sshd,筛选出包含 "sshd" 的行。 - 传给
grep -v grep,过滤掉包含 "grep" 自身的行(避免干扰)。 - 传给
awk '{print $2}',打印每行的第二列(即 PID)。
| 结果类型 | 描述 | 常用命令示例 | 如何处理 |
|---|---|---|---|
| 标准输出 | 命令成功后的正常信息 | ls, cat, ps |
显示在屏幕、> 写入文件、 管道传递 |
| 标准错误 | 命令失败时的错误信息 | ls no_file, cat /root |
显示在屏幕、2> 写入文件、&> 全部写入 |
| 退出状态码 | 数字,表示命令执行成败(0=成功) | 所有命令 | echo $? 查看、if 语句判断 |
理解这三种输出以及如何使用重定向和管道来操纵它们,是从 Linux 新手走向熟练用户的关键一步,掌握这些技巧,你就能将简单的命令组合成强大的、自动化的解决方案。
