为什么我不能在字符串二进制文件上使用 strings 命令?

Jak*_*and 3 binary cat

我无法stringsstrings二进制文件上运行命令(对我来说位于/usr/bin/strings

$ strings $(which strings)
strings
Run Code Online (Sandbox Code Playgroud)

我也无法复制它并在它的副本上尝试:

$ cp -L $(which strings) /tmp/
$ strings /tmp/strings
strings
Run Code Online (Sandbox Code Playgroud)

我能得到它的唯一方法是捕获输出cat

$ strings <<< $(cat $(which strings))
...
Run Code Online (Sandbox Code Playgroud)

但是还有其他命令可以与这种自引用一起使用(例如,cat $(which cat))。我查了一下,它可以在其他一些机器上运行[从这里提取的图像]。也许这是一个 macOS 的东西?(我目前运行的是 macOS 10.14)。

我知道这是一个愚蠢的问题,可能没有用例,但我只是好奇......

phu*_*clv 6

我在 macOS 中的 zsh 和 bash 中都有相同的行为。事实证明,strings在 macOS 中只查看Mach-O 二进制文件的非文本部分。来自man strings

除非-给出标志,否则字符串会在目标文件的所有部分中查找,除了 ( __TEXT, __text) 部分。如果没有指定文件,则读取标准输入。

因此,要强制strings将文件视为纯二进制文件而不是 Mach 可执行文件,您需要传递-标志。strings - "$(command -v strings)"只要您没有重新定义string为函数,就会按预期工作。

zsh,你可以只使用strings - =strings其中=strings扩展到路径strings命令不管你是否还获得了由名或无法正常工作(见"$(command -ve strings)"yash壳)。