-o 是一个非常常见且用途广泛的命令行选项,它的全称是 "output"(输出),它的核心作用是指定一个文件名,将命令的输出结果写入到这个文件中,而不是显示在终端上。

这通常与另一个常用选项 (连字符)配合使用, 代表标准输出。
核心功能:重定向输出到文件
-o 最主要的功能就是作为“输出文件”的标志。
基本语法
command -o <filename>
或者
command -o <filename> [other_options] [arguments]
工作原理
当你使用 -o 时,命令会将它本应打印到屏幕上的内容保存到你指定的 <filename> 文件中,如果文件已存在,它通常会被覆盖(具体行为取决于命令的实现)。

常见命令中的 -o 用法
-o 的具体含义和行为会因命令的不同而有所差异,下面是一些最常见和最重要的例子:
a) gcc / g++ (GNU C/C++ 编译器)
在编译器中,-o 用于指定输出的可执行文件的名称。
语法:
gcc -o <output_executable_name> <source_file.c>
示例:
假设你有一个名为 hello.c 的 C 语言程序:

#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
你想将它编译成一个名为 my_app 的可执行文件,而不是默认的 a.out:
gcc -o my_app hello.c
-o my_app: 告诉gcc编译器,将生成的可执行文件命名为my_app。hello.c: 源代码文件。
编译成功后,你可以直接运行 ./my_app:
./my_app # 输出: Hello, World!
b) ldd (List Dynamic Dependencies)
ldd 用于列出程序运行时所需要的动态链接库。-o 选项用于将输出重定向到一个文件。
语法:
ldd -o <filename> <executable>
示例:
将 /bin/ls 命令的依赖库信息保存到 ls_dependencies.txt 文件中:
ldd -o ls_dependencies.txt /bin/ls
执行后,ls_dependencies.txt 文件会包含类似以下的内容:
linux-vdso.so.1 (0x00007ffc...)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5d...)
/lib64/ld-linux-x86-64.so.2 (0x00007f5d...)
c) openssl (OpenSSL 命令行工具)
openssl 是一个功能强大的密码学工具套件,在 openssl 的许多子命令中,-o 用于指定输出文件的名称。
语法 (以 req 子命令为例):
openssl req -x509 -newkey rsa:4096 -keyout <key_file> -out <cert_file> -days 365 -nodes
虽然这里用的是 -out,但很多其他 openssl 子命令(如 enc, dgst 等)使用 -out 或 -o 来指定输出,其功能与 ldd 中的 -o 类似。
示例:
生成一个自签名的 SSL 证书,并将私钥和证书分别保存到 key.pem 和 cert.pem。
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
-keyout key.pem: 指定私钥的输出文件。-out cert.pem: 指定证书的输出文件。
d) nm (显示符号表)
nm 用于列出目标文件、可执行文件或库中的符号名称。-o 或 --print-file-name 选项会在每一行前面加上输入文件的名称。
语法:
nm -o <file>
示例:
查看 my_app 可执行文件中的符号,并显示文件名。
nm -o my_app
输出可能如下:
my_app: w _edata
my_app: w _end
my_app: t __JCR_LIST__
my_app: w __JCR_END__
my_app: T __libc_csu_fini
my_app: T __libc_csu_init
my_app: U __libc_start_main@@GLIBC_2.2.5
my_app: T main
my_app: U printf@@GLIBC_2.2.5
...
这里的 my_app: -o 选项添加的文件名前缀。
e) make (构建工具)
在 make 中,-o 或 --old-file 选项用于告诉 make,指定的文件比它的所有依赖项都“旧”,即使文件的时间戳更新,也强制重新构建它,这个用法比较特殊,不用于输出文件。
-o 与 > 和 的关系
-o vs. > (重定向符号)
初学者可能会混淆 -o 和 >。
| 特性 | -o |
> |
|---|---|---|
| 类型 | 命令的选项 | Shell 的重定向操作符 |
| 作用 | 告诉命令本身如何处理输出 | 告诉 Shell 将前一个命令的输出重定向到文件 |
| 位置 | 必须紧跟在命令后面,作为命令参数的一部分 | 位于整个命令行的末尾 |
| 通用性 | 不同命令中含义可能不同 | 通用,几乎所有命令都适用 |
对比示例:
编译 hello.c 并生成 my_app。
# 使用 gcc 的 -o 选项 (推荐方式) gcc -o my_app hello.c
# 使用 shell 的 > 重定向 (不适用于此场景,会出错) gcc hello.c > my_app # 错误!这会把 gcc 的编译信息(如果有错误)写入 my_app,但可执行文件仍然是 a.out
> 通常用于捕获命令的标准输出,而 -o 通常是命令内部的一个特殊标志,用于定义其核心行为(如编译器的输出文件名)。
-o 与 (标准输出)
在 -o 的值中使用 (连字符)是一个约定俗成的用法,代表标准输出。
语法:
command -o -
示例:
tar 命令就是一个很好的例子,它可以将文件打包并直接输出到标准输出,而不是一个文件。
# 将 my_app 文件打包,并通过管道传递给 gzip 压缩,最终输出到屏幕 tar -c -f - my_app | gzip -c
这里的 -f - 中的 就代表标准输出,这个压缩后的数据流可以通过管道传给另一个命令,或者重定向到文件。
| 命令 | -o 的含义 |
示例 |
|---|---|---|
gcc/g++ |
指定输出的可执行文件名 | gcc -o server server.c |
ldd |
将依赖信息输出到指定文件 | ldd -o deps.txt /bin/ls |
nm |
在输出中显示文件名前缀 | nm -o my_app |
openssl |
指定输出文件名 | openssl ... -out cert.pem |
make |
(特殊用法) 强制重建文件 | make -o my_file.o |
核心要点:
- 主要功能:
-o最常见的用途是指定一个输出文件。 - 命令相关:它的具体含义由它所依附的命令决定。
- 与
>的区别:-o是命令选项,>是 Shell 重定向符。 - 查看帮助:如果不确定某个命令中
-o的用法,最好的方法是使用man命令查看其手册页。man gcc man ldd man nm
