type 명령은 실행 가능한 명령과 쉘 스크립트를 구별할 수 없습니다.

type 명령은 실행 가능한 명령과 쉘 스크립트를 구별할 수 없습니다.

그래서 책을 읽고 있었는데리눅스 명령줄, 명령에는 네 가지 유형이 있다고 나와 있습니다.

(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파일이 일반 텍스트인지 바이너리인지 확인할 수도 있지만 이로 인해 금방 혼란스러울 수 있습니다. :)

관련 정보