echo 쉘이 내장 된 이유는 무엇입니까?


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

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


5
이것은 쉘마다 다릅니다. ZSH는 그것을 빌드하지만 BASH는 그렇지 않습니다.
tsvallender

21
@tsv : echo가장 확실한 것은 Bash 내장입니다. 사실, 그것은 모든 주요 현대 쉘에 내장되어 있습니다.
추후 공지가있을 때까지 일시 중지되었습니다.

답변:


71

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

  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..
*/      

언급 한 SysV UM, Vol II의 385 페이지에는 printksh에 대한 기본 제공 명령이 echo있습니다. 이 명령은 ISC의 AT & T Unix SVR4 2.1 i386에도 있습니다. print "\012"에코와 동일한 결과를 생성합니다. ksh가 왜 인쇄되고 에코가 없는지 궁금하십니까? 어쨌든 정말 흥미 롭습니다.

몇 년 전의 그러한 보석은 2016 년 편집으로 발굴되기를 기다리는 중입니다. +1
iruvar

+1. 감사. 내 (체계적인) 읽기 / 학습을 위해 명령을 내장 할 목적으로 소스 (참조)를 제공 할 수 있습니까?
Tim

체계적으로 읽거나 배울 수있는 참조, 매뉴얼 또는 표준을 찾고 싶습니다. bash 참조 매뉴얼 및 POSIX 사양에서 찾아 보았습니다. 그러나 나는 그것을 찾을 수 없습니다. 내가 그리워하는지 확실하지 않습니다.
Tim

@Tim :이 답변과 다른 답변에서 설명하는 것처럼 일부 명령 셸에 내장되어 있어야합니다 . 그렇지 않으면 작업을 수행 할 수 없습니다. 다른 모든 것은 순전히 선택 사항 입니다. 그것은 본질적으로 나의 Bourne 쉘 소스 스 니펫이 위에서 말한 것입니다. 그러한 명령을 쉘에 빌드하는 것은 선택 사항이므로 권한있는 이론적 근거는 한 구현 자의 의견 만 제시 할 수 있습니다.
워렌 영

19

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

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

거의 모든 외부 실행 파일은 라이브러리 파일에 의존한다는 것을 잊지 마십시오. 때때로 재앙이 발생하고 해당 라이브러리를로드 할 수 없습니다 (조언 : ldconfig수행중인 작업을 정확히 알지 않는 한 절대로 발행 하지 마십시오 ). 또한, / bin 또는 / sbin 파티션을 날려 버려도 쉘이로드되어 있으면 어떻게해야합니까?
LawrenceC

PID가 부족하면 종료하려는 PID를 찾기가 어려울 수 있습니다. ps명령을 실행할 수 없으므로를 통해 PID를 수동으로 찾아야합니다 /proc.
kasperd

CentOS which는 (적어도) 실행되는 bash 별명 이지만 alias | /usr/bin/which --read-alias ...외부 which 별명 식별 할 수 있지만 여전히 내장되어 있지는 않습니다. 나는 이것을 화려하게 할 것인지 아니면 왜곡 된 것으로 할 것인지 결정할 수 없다.
dave_thompson_085

ls 명령이 더 이상 작동하지 않는 시점에서 부트 / 마스터 대신 슬레이브로 드라이브를 마운트하고 파일 구조를 그런 식으로 수정해야한다고 생각합니다. echo> 파일에 있지 않고 수정하는 데 시간이 오래 걸리지 않으면 echo로 시스템 손상 정도를 어떻게 해결할 수 있는지 잘 모르겠습니다. 시스템 구조를 수정하는 bash 스크립트를 작성할 수 있습니다.
jonnyjandles

13

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를 사용합니다. 그러나 스크립트는 여전히 모든 곳에서 잘 작동하기 때문에 중요하지 않습니다.


3
쉘 내장에 대해 말하면, "which"대신 "type"을 사용해야합니다.
Teddy

감사합니다 @Teddy. 기억이 나기 시작했습니다. 덕분에 인생이 훨씬 나아졌습니다 type.
Stefan Lasiewski

6

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


2

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

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

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

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


3
원래 포스터의 테스트는 /bin/echo존재하지 않는 가설을 지원 하지 않습니다. 그들은 단지 내장이 echoPATH의 모든 프로그램 보다 우선한다는 것을 보여줍니다 .
워렌 영

1

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

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

echo "$PASSWORD" >./password

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

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

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

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


3
유용한 부작용이 있지만 이것이 그 이유라는 것이 매우 의심 스럽습니다.
plugwash

@DepressedDaniel : 무엇을 백업합니까? 답을 뒷받침하기 위해 사용한 참고 문헌은 어디에 있습니까?
joker
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.