echo가 쉘 내장 명령인 이유는 무엇입니까?

echo가 쉘 내장 명령인 이유는 무엇입니까?
$ which echo
echo: shell built-in command.
$ which ls
/bin/ls
$ which cat
/bin/cat

echo 등과 같은 독립 ls실행형 유틸리티가 ps아닌 이유는 무엇입니까 cat? 왜 쉘에 특정합니까? 타당한 이유가 있나요?

답변1


내장 함수에는 두 가지 유형이 있습니다.

  1. 일부 명령은 외부 명령인 경우 작동하지 않으므로 쉘 프로그램 자체에 내장되어야 합니다.

    cd그게 전부입니다. 외부인 경우 자체 디렉토리만 변경할 수 있기 때문에 쉘의 현재 작업 디렉토리에는 영향을 미치지 않습니다. (또한보십시오:cd프로그램이 아닌가?)

  2. 순전히 효율성을 위해 또 다른 클래스의 명령이 셸에 내장되어 있습니다.

    이것dash 매뉴얼 페이지이 클래스에서 명령의 printf예로 , 및 가 언급 echo된 내장 명령에 대한 섹션이 있습니다 .test

Unix 시스템에는 항상 두 번째 유형의 명령에 대한 별도의 실행 파일이 포함되어 있습니다. 이러한 개별 실행 파일은 내가 사용한 모든 Unixy 시스템에서 여전히 사용할 수 있지만 사용하는 모든 셸에도 내장되어 있습니다. (POSIX이러한 실행 파일은 실제로 존재해야 합니다. )

echo나는 이것이 AT&T Unix System V Release 3.1의 쉘에 내장되어 있다고 믿습니다 . 내 결론은 AT&T 매뉴얼의 두 가지 버전을 비교한 결과입니다.3B1 시리즈 유닉스 시스템. 누군가 친절하게도 이 매뉴얼의 1986년판을 스캔해 주었습니다.온라인에 올려놔;이것들은 SVR3의 원본 버전에 해당합니다. echo523페이지의 목록에 없는 것을 볼 수 있습니다 .UNIX System V 사용자 매뉴얼, 2권, 명령이 셸에 내장된 경우 예상한 대로입니다. 1987년 SVR3.1 매뉴얼의 내 지역 종이 사본에는 다음과 같은 내용이 있습니다.echo 설명서의 이 섹션에 나열되어 있습니다.

여기가 버클리가 아닌 건 확실해중국남방연구그룹AT&T는 혁신을 국내로 가져옵니다. 4.3BSD는 SVR3과 같은 해인 1986년에 출시되었습니다.4.3BSD sh.1 맨페이지echo, 특수 명령 섹션의 내장 명령 목록에 없는 것을 볼 수 있습니다 . CSRG가 이를 수행한 경우 이를 입증하기 위해 문서화된 소스가 필요합니다.

이 시점에서 SVR3.1이 SVR3.1 이전에 셸에 내장되었는지 궁금할 수 있지만 echo전혀 그렇지 않습니다.녹음된그때까지. 제가 사용할 수 있는 최신 SVR3 이전 AT&T Unix 소스 코드는 다음과 같습니다.PDP-11 System III 압축 패키지, Bourne 쉘 소스 코드를 찾을 수 있습니다. echo에 있는 내장 명령 테이블에서는 이 명령을 찾을 수 없습니다 /usr/src/cmd/sh/msg.c. 파일의 타임스탬프에 따르면 echo1980은 확실히 셸에 없습니다.


하찮은 일

동일한 디렉토리에는 이 질문에 대한 내용이 전혀 포함되지 않은 파일도 포함되어 있지만 builtin.c다음과 같은 흥미로운 설명을 발견했습니다.

/*      
    builtin commands are those that Bourne did not intend
    to be part of his shell.
    Redirection of i/o, or rather the lack of it, is still a
    problem..
*/      

답변2

일부 명령이 내장되어 있는 세 번째 이유는 외부 명령을 실행할 수 없을 때 사용할 수 있다는 것입니다.

때로는 시스템이 심각하게 손상되어 ls명령이 작동하지 않는 경우도 있습니다. 어떤 경우에는 유언장이 echo *여전히 유효합니다.

또 다른 (더 중요한!) 예 kill: 시스템에 사용 가능한 PID가 부족하면 실행되지 않지만 /bin/kill(PID가 필요하기 때문에 :-) 내장된 시스템은 kill작동합니다.

BTW는 which외부 명령이므로(적어도 내부 명령이 아닌 bash에서는) 내부 명령을 나열할 수 없습니다. 예를 들어:

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

답변3

~에 따르면배쉬 참조 매뉴얼, 이는 편의를 위한 것입니다.

셸은 또한 별도의 유틸리티를 통해 얻을 수 없거나 편리하지 않은 기능을 활성화하는 작은 내장 명령 세트(내장)를 제공합니다. 예를 들어 cd, break, Continue, exec)는 셸 자체에서 직접 작동하기 때문에 셸 외부에서 구현할 수 없습니다. History, getopts, kill 또는 pwd 내장 명령 등은 별도의 유틸리티로 구현할 수 있지만 내장 명령으로 사용하는 것이 더 편리합니다. 모든 쉘 내장 함수는 후속 섹션에서 설명됩니다.

이것고급 Bash 스크립팅 가이드더 자세한 설명이 있습니다:

"내장 기능은 실제로 내장된 Bash 도구 세트에 포함된 명령입니다. 이는 성능상의 이유 중 하나입니다. 내장 기능은 종종 분기가 필요한 외부 명령보다 빠르게 실행됩니다. 1 별도의 프로세스 - 또는 특정 내장 기능이 쉘 내부에 직접 액세스해야 하기 때문입니다. "

또한 echo일부 시스템에서는 독립 실행형 유틸리티로 존재한다는 점도 참고하세요. 이것이 내 Darwin 시스템(MacOSX 10.5.8 - Leopard)에 있는 것입니다.

$ uname -a
Darwin host.foo.org 9.8.0 Darwin Kernel Version 9.8.0: Wed Jul 15 16:55:01 PDT 2009; root:xnu-1228.15.4~1/RELEASE_I386 i386
$ bash --version
GNU bash, version 3.2.17(1)-release (i386-apple-darwin9.0)
Copyright (C) 2005 Free Software Foundation, Inc.
$ which echo
/bin/echo

echo내장 기능으로도 사용할 수 있지만 내 스크립트는 Mac에서는 /bin/echo를 사용하고 대부분의 Linux 및 FreeBSD 시스템에서는 Bash 내장을 사용합니다. 그러나 스크립트는 여전히 모든 곳에서 잘 작동하기 때문에 그것은 중요하지 않은 것 같습니다.

답변4

echo이것이 쉘 내장이어야 하는 진짜 이유입니다:

당신이 비밀번호를 가지고 있다고 가정해 봅시다 $PASSWORD. 어떻게 파일에 쓸 수 있나요 ./password? 대부분의 프로그래머는 자연스럽게 다음과 같이 작성합니다.

echo "$PASSWORD" >./password

그러나 echo쉘에 내장되어 있지 않으면 ps메시지를 통해 모든 사용자에게 비밀번호가 노출됩니다.

물론, 똑똑해지고 싶다면 비밀번호를 사용하지 않고 비밀번호를 저장하는 방법을 찾을 수 있습니다 echo. 아마도 다른 쉘 기능을 활용할 수도 있습니다.

cat >./password <<EOF
${PASSWORD}
EOF

그러나 echo비밀번호를 파일에 저장하는 가장 확실한 방법도 작동해야 하기 때문에 내장되어 있다는 것은 중요한 안전 벨트입니다.

관련 정보