Cat
為什麼我不能在字元串二進製文件上使用字元串命令?
我無法
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)。我知道這是一個可能沒有案例的愚蠢問題,但我只是好奇……
我在 macOS 的 zsh 和 bash 中得到了相同的行為。事實證明,
strings
在 macOS 中只查看 Mach-O 二進製文件的非文本部分。來自man strings
:除非
-
給出標誌,否則字元串會在目標文件的所有部分中查找,除了 (__TEXT
,__text
) 部分。如果沒有指定文件,則讀取標準輸入。因此,要強制
strings
將文件視為純二進製而不是 Mach 執行檔,您需要傳遞-
標誌。strings - "$(command -v strings)"
只要您沒有重新定義string
為函式,它將按預期工作。在
zsh
中,您可以只使用strings - =strings
where=strings
擴展為strings
命令的路徑,而不管您是否還具有該名稱的函式(另請參見"$(command -ve strings)"
shell 中yash
)。