文字列バイナリで文字列コマンドを使用できないのはなぜですか?

文字列バイナリで文字列コマンドを使用できないのはなぜですか?

バイナリ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でも同じ動作が発生します。stringsmacOSでは表示するだけです。非テキスト部分Mach-Oバイナリ用。からman strings

-このフラグを指定しないと、ターゲットファイルの(__TEXT、、__text)部分を除くすべての部分から文字列が検索されます。ファイルを指定しない場合は、標準入力を読み込みます。

したがって、stringsファイルをMach実行可能ファイルではなく純粋なバイナリとして扱うには、この-フラグを渡す必要があります。関数としてstrings - "$(command -v strings)"オーバーライドしない限り、期待どおりstringに機能します。

では、同じ名前の関数があるかどうかにかかわらず、コマンドパスで展開された場所をzsh使用できます(shellを参照)。strings - =strings=stringsstrings"$(command -ve strings)"yash

関連情報