'cat'은 내장 또는 외부 프로그램입니까?


33

type명령을 사용하여 cat쉘 내장 프로그램인지 외부 프로그램인지 확인하면 아래 출력이 표시됩니다.

-$ type cat
cat is hashed (/bin/cat)
-$

이것은 그것이 cat외부 프로그램 이라는 것을 의미합니까 /bin/cat?

나는 아래의 출력을 선택하면 때문에, 혼란있어 echo나는 그것이 것을 알게되었다 built-in뿐만 아니라 프로그램을/bin/echo

-$ type echo
echo is a shell builtin
-$ which echo
/bin/echo
-$ 

/bin/catecho는 /bin/echo내장되어 있었기 때문에 외부 프로그램을 의미하는 논리를 사용할 수 없었 습니다.

그래서 나는 무엇인지 어떻게 알 수 cat있습니까? 내장 또는 외장?


1
-cat 명령은 시스템의 일부를 구성하는 외부 프로그램이며, 원인에 따라 수행 할 수있는 많은 작업은 단순한 내장 기능이 아닙니다.
Joke Sr. OK

12
type which답을 which줄 수없는 이유 는 무엇입니까?
Dubu

1
사용중인 쉘에 따라 다름
nsn

6
재미있는 사실 : 모두 catls/ 스톨만 자신이 쓴된다. 그가 쓴 내용이 얼마나 놀랍습니까? 그는 오늘날 세계에서 가장 우수한 컴파일러 인 최초의 컴파일러 버전을 모든 것을 컴파일하고 대부분의 핵심 유틸리티를 작성했음을 잊지 마십시오. 그냥 말하세요 '
Alec Teal

2
@AlecTeal 당신은 대부분의 유닉스 시스템이 Richard Stallman이 가지고 있던 GNU 버전보다 오래전의 ls와 cat 버전을 사용한다는 것을 알고 있습니까?
로스 릿지

답변:


59

type쉘이 무엇을 사용할 것인지 알려줍니다. 예를 들면 다음과 같습니다.

$ type echo
echo is a shell builtin
$ type /bin/echo
/bin/echo is /bin/echo

즉, bash 프롬프트에서을 입력 echo하면 내장 기능이 제공됩니다. 에서 /bin/echo와 같이 경로를 지정 하면 외부 명령이 표시됩니다.

which대조적으로, 쉘이 무엇을하는지에 대한 특별한 지식이없는 외부 프로그램입니다. 데비안과 유사한 시스템 which에는 PATH 스크립트로 실행 파일을 검색합니다. 따라서 쉘이 내장을 사용하더라도 외부 실행 파일의 이름을 제공합니다.

명령이 내장으로 만 사용 가능하면 which아무것도 반환하지 않습니다.

$ type help
help is a shell builtin
$ which help
$ 

이제 보자 cat:

$ type cat
cat is hashed (/bin/cat)
$ which cat
/bin/cat

cat 쉘 내장이 아닌 외부 실행 파일입니다.


5
당신은 수 type -all echo(하나의 당신이 뭔가를 지정하지 않은 경우 쉘이 호출과 같은 순서를 변경하려면, 호출되는 첫 번째 셸에 알려진 "에코"다른있는 (위해) 발견하는 "echo"\echo, 또는 command echo)
Olivier Dulac 2016 년

좋은 대답입니다. 한 가지 추가 사항 : echo역사적 이유로 두 가지 버전이 있습니다 . 외부 명령으로 시작한 다음 내장으로 추가되었습니다. Bourne 쉘 ( /bin/sh) 의 초기 버전에는 없었습니다. /bin/echo모든 종류의 것들에 의존하기 때문에 호환성을 유지했습니다. (와 같은 일이 일어났다 test.)
Alexis

참고 사항 : which자체는 쉘 내장 cmd가 될 수 있습니다 (예 : tcsh) :which which which: shell built-in command.
Dan Cornilescu

나는 파티에 늦게 도착 해요,하지만 당신은 왜 그 사람이 페이지를 확인하지 않고 당신이 실제로 내장 쉘 또는 무엇 여부를 나타내는 괄호 사이의 수를 볼 수 있습니다
poz2k4444

46

cat is hashed (/bin/cat)같은 것입니다 cat is /bin/cat(즉, 외부 프로그램입니다 ).

차이점은 이미이 cat세션에서 실행 했기 때문에 bash는 이미이 세션을 찾아 $PATH해시 테이블에 결과 위치를 저장했기 때문에이 세션에서 다시 찾지 않아도됩니다.

세션에서 해시 된 모든 명령을 보려면 다음을 실행하십시오. hash

$ hash
hits    command
   2    /usr/bin/sleep
   3    /usr/bin/man

$ type sleep
sleep is hashed (/usr/bin/sleep)

$ type man
man is hashed (/usr/bin/man)

$ type ls
ls is /usr/bin/ls

$ type cat
cat is /usr/bin/cat

$ type echo
echo is a shell builtin

9
실제로, 내 생각에 이것은 귀하의 질문을 해결하는 유일한 답변입니다 :)
André Chalella

이럴 ^^^ 사실입니다. 이 답변은 받아 들여 져야합니다.
LinuxSecurityFreak

4

쉘 내장 목록을 확인하는 또 다른 방법 : compgen쉘 내장 자체 사용!

다음 명령은 모든 쉘 내장 명령을 나열합니다.

compgen -b

당신은 확인할 수 있습니다 cat, echo같은 greping 기준 : -

$ compgen -b | grep echo
echo
$ compgen -b | grep cat
$ 

compgen -b | grep cat출력이없는 리턴을 볼 수 있습니다 . 즉, cat쉘 내장이 아닙니다 .

에서 제공하는 유용한 옵션 목록을 방문하십시오compgen .


다른 내장 명령을 사용 help하여 쉘 내장을 표시 할 수도 있습니다 .

$ help help
help: help [-dms] [pattern ...]
    Display information about builtin commands.

이 옵션에 대한 공식적인 문서를 찾을 수 없습니다. 어디에 있는지 알고 있습니까?
Random832

@ Random832의 옵션에 대해 이야기하고 compgen있습니까?
Pandya

예, Bash 맨 페이지에서 -b 또는 다른 옵션의 절반에 대한 내용을 찾을 수 없었습니다. 나중에 gnu.org/software/bash/manual/html_node/
Random832

@ Random832 man bash | grep -e '-A action$' -A 32아마도 이런 식으로 출력을 시도 하십시오 . ( -A올바로 관리 한 후 숫자 증가 / 감소 ).
Pandya

4

whereis매뉴얼 페이지 라이브러리 등과 같이 머신에서 명령이있는 위치를 표시하므로보다 효율적인 명령 을 사용할 수도 있습니다 .


-나의 영어 실력은 실례지만, 아직 배우지 못해서 잘 사용하지 못합니다! ...
Joke Sr. OK

2

다른 사람들은 이미에 대해 답변 cat했습니다 echo.에 문제를 설명하고 싶습니다 . 이 유형의 사용하는 경우 -a옵션 (목록의 모든 일치), 당신은 볼 것 echo입니다 모두 쉘 내장 외부 프로그램 :

$ type -a echo
echo is a shell builtin
echo is /bin/echo

두 사람은 서로 완전히 독립적입니다. type옵션이 없으면 찾은 첫 번째 일치 명령을 반환합니다. 따라서 type foo은 당신이 실행할 때 실행될 것을 보여줍니다 foo. 다른 옵션이있을 수 있지만를 사용하지 않으면 옵션이 표시되지 않습니다 -a.


2

type을 사용하여 cat내장 또는 외부 프로그램 과 같은 명령인지 확인하는 방법에 대한 몇 가지 좋은 대답이 있습니다 . 더 일반적인 접근 방식을 취하겠습니다. 현재 쉘에 영향을 미치기 때문에 내장되어야하는 명령이 있습니다. 세 가지 고전적인 예입니다 cd, exec하고 exit. 기능은 execve 또는 시스템 호출의 동작에 의존하기 때문에 내장되어서는 안되는 명령이 있습니다. 이러한 프로그램의 예는 su, sudo, califesuper. 다른 모든 명령은 내장 또는 외부 프로그램으로 구축 할 수 있습니다.cat내장 클래스로 포함하는 쉘과 그렇지 않은 쉘이 있기 때문에이 클래스의 훌륭한 예제 프로그램입니다. 내장으로 사용 가능한이 클래스의 많은 명령을 외부 프로그램으로도 사용할 수 있다는 점은 주목할 가치가 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.