$ which echo
echo: shell built-in command.
$ which ls
/bin/ls
$ which cat
/bin/cat
왜 에코와 같은 독립적 인 유틸리티 아니다 ls
, ps
, cat
등? 왜 쉘 특정입니까? 좋은 이유가 있습니까?
echo
가장 확실한 것은 Bash 내장입니다. 사실, 그것은 모든 주요 현대 쉘에 내장되어 있습니다.
$ which echo
echo: shell built-in command.
$ which ls
/bin/ls
$ which cat
/bin/cat
왜 에코와 같은 독립적 인 유틸리티 아니다 ls
, ps
, cat
등? 왜 쉘 특정입니까? 좋은 이유가 있습니까?
echo
가장 확실한 것은 Bash 내장입니다. 사실, 그것은 모든 주요 현대 쉘에 내장되어 있습니다.
답변:
내장에는 두 가지 종류가 있습니다.
일부 명령은 외부에있는 경우 작동 할 수 없으므로 쉘 프로그램 자체에 내장되어야합니다.
cd
외부인 경우 자체 디렉토리 만 변경할 수 있으므로 그러한 것 중 하나입니다. 쉘의 현재 작업 디렉토리에는 영향을 미치지 않습니다. (또한 프로그램 이 cd
아닌 이유는 무엇 입니까? )
다른 클래스의 명령은 순전히 효율성을 위해 셸에 내장되어 있습니다.
매뉴얼 페이지에 언급 내장 명령에 대한 섹션이 , 그리고 이 클래스에서 명령의 예를 등을.dash
printf
echo
test
유닉스 시스템은 항상 그 두 번째 클래스의 명령에 대해 별도의 실행 파일을 포함했습니다. 이 별도의 실행 파일은 사용하려는 모든 쉘에 내장되어 있어도 내가 사용한 모든 Unixy 시스템에서 계속 사용할 수 있습니다. ( POSIX는 실제로 이러한 실행 파일이 존재하는 것이 필요합니다.)
echo
AT & 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가이를 수행했다면이를 증명할 문서화 된 출처를 원합니다.
이 시점에서 echo
SVR3.1 이전의 셸에 내장되어 있는지 여부 와이 사실이 그때까지 문서화 되어 있지 않은지 궁금 할 것 입니다. 나에게 사용할 수있는 최신 사전 SVR3 AT & T 유닉스 소스 코드에 PDP-11 시스템 III 타르볼 당신이 Bourne 쉘 소스 코드를 찾을 수있어서,. echo
에있는 기본 제공 명령 테이블에서 찾을 수 없습니다 /usr/src/cmd/sh/msg.c
. 해당 파일의 타임 스탬프를 기반으로 echo
1980 년에 쉘에 없었 음 을 증명합니다 .
같은 디렉토리에는 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..
*/
print
ksh에 대한 기본 제공 명령이 echo
있습니다. 이 명령은 ISC의 AT & T Unix SVR4 2.1 i386에도 있습니다. print "\012"
에코와 동일한 결과를 생성합니다. ksh가 왜 인쇄되고 에코가 없는지 궁금하십니까? 어쨌든 정말 흥미 롭습니다.
일부 명령을 내장해야하는 세 번째 이유가 있습니다. 외부 명령을 실행할 수 없을 때 사용할 수 있습니다.
때때로 시스템이 너무 깨져서 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 파티션을 날려 버려도 쉘이로드되어 있으면 어떻게해야합니까?
ps
명령을 실행할 수 없으므로를 통해 PID를 수동으로 찾아야합니다 /proc
.
which
는 (적어도) 실행되는 bash 별명 이지만 alias | /usr/bin/which --read-alias ...
외부 which
는 별명 을 식별 할 수 있지만 여전히 내장되어 있지는 않습니다. 나는 이것을 화려하게 할 것인지 아니면 왜곡 된 것으로 할 것인지 결정할 수 없다.
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를 사용합니다. 그러나 스크립트는 여전히 모든 곳에서 잘 작동하기 때문에 중요하지 않습니다.
type
.
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
또한이 명령을 내장하고 있습니다 (수 있습니다 적어도 또는 그것은 임베디드 시스템에 사용되는 필요한 모든 것이 생략 할 수 있습니다).
/bin/echo
존재하지 않는 가설을 지원 하지 않습니다. 그들은 단지 내장이 echo
PATH의 모든 프로그램 보다 우선한다는 것을 보여줍니다 .
echo
쉘 내장이되어야 하는 실제 이유는 다음과 같습니다 .
에 비밀번호가 있다고 가정합니다 $PASSWORD
. 파일에 ./password
어떻게 쓰 나요? 당연히 대부분의 프로그래머는 다음과 같이 작성합니다.
echo "$PASSWORD" >./password
그러나 echo
쉘 내장이 아닌 경우 ps
정보를 통해 비밀번호가 모든 사용자에게 누출됩니다 .
물론, 당신이 그것에 대해 영리하고 싶다면 echo
, 다른 쉘 기능을 이용 하지 않고 암호를 저장하는 방법을 찾을 수 있습니다.
cat >./password <<EOF
${PASSWORD}
EOF
그러나 echo
암호를 파일에 저장하는 가장 확실한 방법도 작동해야하므로 내장형으로 사용하는 것이 중요한 안전 벨트입니다.