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

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

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

$ strings $(which strings)
strings

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

$ cp -L $(which strings) /tmp/
$ strings /tmp/strings
strings

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

$ strings <<< $(cat $(which strings))
...

但是还有其他命令可以使用这种自引用(例如,cat $(which cat))。我查了一下它适用于其他一些机器[图片取自这里]。也许这是 macOS 的事情? (我目前运行的是 macOS 10.14)。

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

答案1

我在 macOS 中的 zsh 和 bash 中得到了相同的行为。事实证明,strings在 macOS 中只是查看非文本部分Mach-O 二进制文件的。从man strings

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

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

在 中zsh,您可以只使用strings - =stringswhere=strings扩展为命令的路径,strings无论您是否还有同名的函数(另请参阅shell"$(command -ve strings)"yash)。

相关内容