그래서 책을 읽고 있었는데리눅스 명령줄, 명령에는 네 가지 유형이 있다고 나와 있습니다.
(1) 실행 가능한 프로그램
(2) 쉘 내장 기능
(3) 쉘 기능(쉘 스크립트)
(4) 별칭
그런 다음 명령의 유형을 식별하기 위해 해당 type
명령을 사용할 수 있다고 말합니다.
그러나 이 type
명령은 쉘 기능(쉘 스크립트)과 실행 가능한 명령을 구별할 수 없다는 것을 알았습니다.
예를 들어:
type cp
(will output: cp is /bin/cp)
type bzexe
(will output: bzexe is /bin/bzexe)
그러나 우리 모두는 그것이 cp
실행 가능한 프로그램이고 bzexe
쉘 스크립트라는 것을 알고 있습니다.
이제 내 질문은: 이 둘을 구별하기 위해 어떤 명령을 사용할 수 있습니까?
나는 이 명령을 알고 file
있으며 잘 작동합니다. 이것이 유일한 해결책입니까?
답변1
쉘 스크립트예실행 가능한 프로그램입니다. 그렇기 때문에 type
하나라고 합니다. 쉘 스크립트는 Linux를 통해 실행되는 Perl 스크립트, Python 스크립트, 기본 ELF 실행 파일 및 Qemu 크로스 아키텍처 실행 파일과 같은 실행 가능한 명령입니다.binfmt_misc모든 실행 파일은 사용하는 인터프리터에 관계없이 실행 가능한 명령입니다.
내 예제 목록에서 알 수 있듯이 "스크립팅된"과 "스크립트되지 않은" 사이의 경계는 모호합니다.셰르본스크립트이지만 네이티브 코드도 아니고 스크립트도 아닌 실행 파일도 있습니다.
프로그램을 실행할 때 어떤 언어로 작성되었는지는 중요하지 않습니다. 그러니 type
이 사실을 말해도 소용이 없습니다. 이것이 하는 일은 type
쉘의 관점에서 어떤 유형의 명령인지 알려주는 것뿐입니다.
쉘 스크립트는 함수와 다릅니다. 함수는 셸 내부에서 실행되며 셸 환경을 수정할 수 있습니다. 쉘 스크립트는 별도의 프로그램입니다. 이 별도의 프로그램은 현재 실행 중인 프로그램과 동일한 언어로 작성될 수 있지만 이는 단지 우연일 뿐입니다.
답변2
원하는 명령은 입니다 file
.
type /bin/bash
/bin/bash is /bin/bash
file /bin/bash
/bin/bash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, stripped
type /bin/zcat
/bin/zcat is /bin/zcat
file /bin/zcat
/bin/zcat: POSIX shell script, ASCII text executable
편집: 죄송합니다. 방금 게시물의 마지막 줄을 읽었습니다. file
유일한 옵션은 아니지만 아마도 최선일 것입니다. 비슷한 방법을 사용하여 head
파일이 일반 텍스트인지 바이너리인지 확인할 수도 있지만 이로 인해 금방 혼란스러울 수 있습니다. :)