readelf -d a.out | vim - 和 readelf -d a.out | vim 有什么区别?
readelf -d a.out | vim -
和 readelf -d a.out | vim
有什么区别?
在 Linux 中,readelf -d a.out | vim -
和 readelf -d a.out | vim
这两个命令虽然都尝试将 readelf
的输出传递给 vim
,但它们之间存在一个关键差异:
命令解析
readelf -d a.out | vim -
- 管道符
|
将readelf
的标准输出(stdout)连接到vim
的标准输入(stdin)。 vim
的参数-
是一个特殊符号,表示 “从标准输入读取内容”。因此,vim
会打开一个新缓冲区,并将readelf
的输出作为文件内容显示。
- 管道符
readelf -d a.out | vim
- 虽然管道同样将
readelf
的输出发送到vim
的标准输入,但vim
默认不会读取标准输入(除非明确指定-
参数)。 - 在这种情况下,
vim
会忽略标准输入,直接启动一个空的编辑器窗口(相当于直接运行vim
)。readelf
的输出会被丢弃,或者在某些环境下导致vim
启动异常。
- 虽然管道同样将
实际效果对比
命令 | vim 是否读取输入 | 行为 |
---|---|---|
`readelf -d a.out | vim -` | ✅ |
`readelf -d a.out | vim` | ❌ |
为什么需要 -
参数?
vim
的设计决定了它默认从文件系统读取文件,而非标准输入。通过显式传递 -
参数,你告诉 vim
:“使用标准输入作为文件内容”。这类似于以下命令:
readelf -d a.out > temp.txt && vim temp.txt # 效果类似 readelf -d a.out | vim -
示例场景
假设 readelf -d a.out
输出共享库依赖信息:
Dynamic section at offset 0xe18 contains 26 entries:Tag Type Name/Value0x0000000000000001 (NEEDED) Shared library: [libc.so.6]0x000000000000000c (INIT) 0x400400...
- 使用
| vim -
会在vim
中显示上述内容,可进行编辑或保存。 - 使用
| vim
则会打开空的vim
,看不到任何输出,或者vim报错。
总结
如果你想在 vim
中查看或编辑 readelf
的输出,必须使用 | vim -
。省略 -
参数会导致标准输入被忽略,这是 vim
的默认行为。