目录

readelf-d-a.out-vim-和-readelf-d-a.out-vim-有什么区别

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,但它们之间存在一个关键差异:

命令解析

  1. readelf -d a.out | vim -
    • 管道符 |readelf 的标准输出(stdout)连接到 vim 的标准输入(stdin)。
    • vim 的参数 - 是一个特殊符号,表示 “从标准输入读取内容”。因此,vim 会打开一个新缓冲区,并将 readelf 的输出作为文件内容显示。
  2. readelf -d a.out | vim
    • 虽然管道同样将 readelf 的输出发送到 vim 的标准输入,但 vim 默认不会读取标准输入(除非明确指定 - 参数)。
    • 在这种情况下,vim 会忽略标准输入,直接启动一个空的编辑器窗口(相当于直接运行 vim)。readelf 的输出会被丢弃,或者在某些环境下导致 vim 启动异常。

实际效果对比

命令vim 是否读取输入行为
`readelf -d a.outvim -`
`readelf -d a.outvim`

为什么需要 - 参数?

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/Value
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000c (INIT)               0x400400
 ...
  • 使用 | vim - 会在 vim 中显示上述内容,可进行编辑或保存。
  • 使用 | vim 则会打开空的 vim,看不到任何输出,或者vim报错。

总结

如果你想在 vim 中查看或编辑 readelf 的输出,必须使用 | vim -。省略 - 参数会导致标准输入被忽略,这是 vim 的默认行为。