我无法strings
在strings
二进制文件上运行命令(对我来说位于/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)。
我知道这是一个愚蠢的问题,可能没有用例,但我只是好奇......
我在 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
壳)。