문자열 바이너리에서 문자열 명령을 사용할 수 없는 이유는 무엇입니까?

문자열 바이너리에서 문자열 명령을 사용할 수 없는 이유는 무엇입니까?

바이너리 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

관련 정보