我无法strings
在strings
二进制文件上运行命令(对我来说,它位于/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 - =strings
where=strings
扩展为命令的路径,strings
无论您是否还有同名的函数(另请参阅shell"$(command -ve strings)"
中yash
)。