echo 쉘이 내장 된 이유는 무엇입니까? 독립적 인 유틸리티 아니다 ls,

$ which echo
echo: shell built-in command.
$ which ls
/bin/ls
$ which cat
/bin/cat

왜 에코와 같은 독립적 인 유틸리티 아니다 ls, ps, cat등? 왜 쉘 특정입니까? 좋은 이유가 있습니까?



답변


내장에는 두 가지 종류가 있습니다.

  1. 일부 명령은 외부에있는 경우 작동 할 수 없으므로 쉘 프로그램 자체에 내장되어야합니다.

    cd외부인 경우 자체 디렉토리 만 변경할 수 있으므로 그러한 것 중 하나입니다. 쉘의 현재 작업 디렉토리에는 영향을 미치지 않습니다. (또한 프로그램 cd아닌 이유는 무엇 입니까? )

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

    매뉴얼 페이지에 언급 내장 명령에 대한 섹션이 , 그리고 이 클래스에서 명령의 예를 등을.dash printfechotest

유닉스 시스템은 항상 그 두 번째 클래스의 명령에 대해 별도의 실행 파일을 포함했습니다. 이 별도의 실행 파일은 사용하려는 모든 쉘에 내장되어 있어도 내가 사용한 모든 Unixy 시스템에서 계속 사용할 수 있습니다. ( POSIX는 실제로 이러한 실행 파일이 존재하는 것이 필요합니다.)

echoAT & T Unix System V Release 3.1의 셸에 내장되어 있다고 생각 합니다. 나는 AT & T 3B1 시리즈 유닉스 시스템에 대한 두 가지 다른 버전의 매뉴얼 비교를 기반으로한다 . 누군가이 매뉴얼의 1986 년 판을 친절하게 스캔 하여 온라인에 넣었습니다 . 이는 SVR3의 최초 릴리스에 해당합니다. 명령이 셸에 내장 된 경우 예상되는 UNIX System V 사용 설명서, 볼륨 II의echo 523 페이지 목록에없는 것을 볼 수 있습니다 . 1987에서 SVR3.1 매뉴얼 내 지역 신문 사본에서 됩니다 매뉴얼의이 섹션에 나열된.echo

이것이 AT & T가 집으로 가져온 Berkeley CSRG의 혁신 이 아니라고 확신합니다 . 4.3BSD는 1986 년 SVR3과 같은 해에 나왔지만 4.3BSD의 sh.1 맨 페이지 를 보면 echo“Special Commands”섹션의 내장 명령 목록에없는 것을 알 수 있습니다 . CSRG가이를 수행했다면이를 증명할 문서화 된 출처를 원합니다.

이 시점에서 echoSVR3.1 이전의 셸에 내장되어 있는지 여부 와이 사실이 그때까지 문서화 되어 있지 않은지 궁금 할 것 입니다. 나에게 사용할 수있는 최신 사전 SVR3 AT & T 유닉스 소스 코드에 PDP-11 시스템 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..
*/      


답변

일부 명령을 내장해야하는 세 번째 이유가 있습니다. 외부 명령을 실행할 수 없을 때 사용할 수 있습니다.

때때로 시스템이 너무 깨져서 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


답변

Bash Reference Manual 에 따르면 편의성에 관한 것입니다.

쉘은 또한 별도의 유틸리티를 통해 얻을 수 없거나 불편한 기능을 구현하는 작은 내장 명령 세트 (내장)를 제공합니다. 예를 들어, cd, break, continue 및 exec)는 쉘 자체를 직접 조작하기 때문에 쉘 외부에서 구현할 수 없습니다. 히스토리, getopts, kill 또는 pwd 내장은 별도의 유틸리티로 구현 될 수 있지만 내장 명령으로 사용하는 것이 더 편리합니다. 모든 쉘 내장은 다음 섹션에서 설명합니다.

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

“A의 내장은 그대로 내장 배쉬 도구 세트 내에 포함 된 명령입니다 이것은 성능상의 이유로 중 하나입니다 -. 내장 명령은 일반적으로 떨어져 분기 요구하는 외부 명령,보다 빠르게 실행
특정 내장 직접 필요하기 때문에 또는 – 별도의 프로세스를 “쉘 내부에 접근.”

또한 echo일부 시스템에서는 독립형 유틸리티로 존재합니다. 다윈 시스템에있는 내용은 다음과 같습니다 (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를 사용합니다. 그러나 스크립트는 여전히 모든 곳에서 잘 작동하기 때문에 중요하지 않습니다.


답변

bhm의 답변을 보완하기 위해 /bin실수로에서에서 제거 되었다고 가정 해 봅시다 PATH. 당신은 그것을 echo $PATH알아낼 수 있기를 원 하십니까?


답변

echo오늘날 대부분의 셸에는 내장 기능이 포함되어 있지만 GNU CoreUtils에는 독립 실행 형 구현도 포함되어 있습니다.

$ which echo
/bin/echo
$ dpkg -S /bin/echo
coreutils: /bin/echo

GNU Coreutils가 설치되어 있지 않은 것 같습니다 (대부분의 Linux 기반 데스크탑 및 서버 OS에는 기본적으로 설치되어 있지만 내장 Linux 또는 다른 UNIX는 대체 셸 유틸리티 모음을 대신 사용할 수 있음).

BTW : 당신이 보면 비지 박스 , 당신은 그것을 볼 수 있습니다 ls, ps그리고 cat또한이 명령을 내장하고 있습니다 (수 있습니다 적어도 또는 그것은 임베디드 시스템에 사용되는 필요한 모든 것이 생략 할 수 있습니다).


답변

echo쉘 내장이되어야 하는 실제 이유는 다음과 같습니다 .

에 비밀번호가 있다고 가정합니다 $PASSWORD. 파일에 ./password어떻게 쓰 나요? 당연히 대부분의 프로그래머는 다음과 같이 작성합니다.

echo "$PASSWORD" >./password

그러나 echo쉘 내장이 아닌 경우 ps정보를 통해 비밀번호가 모든 사용자에게 누출됩니다 .

물론, 당신이 그것에 대해 영리하고 싶다면 echo, 다른 쉘 기능을 이용 하지 않고 암호를 저장하는 방법을 찾을 수 있습니다.

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

그러나 echo암호를 파일에 저장하는 가장 확실한 방법도 작동해야하므로 내장형으로 사용하는 것이 중요한 안전 벨트입니다.


답변