/ bin / echo가 왜 있고 왜 사용하고 싶습니까?


52

/bin/echoUbuntu MATE 17.04 시스템에 바이너리 실행 파일이 있음을 알았습니다 .

나는 그것이 이상하다고 생각했다.

$ type echo
echo is a shell builtin

커서 테스트는 /bin/echoBash 내장과 같은 종류의 기능을 수행한다고 제안합니다 echo.

$ /bin/echo foo
foo
$ /bin/echo $USER
zanna

그렇다면 왜 echoBash 프로그램과 다른 버전의 별도 버전이 있으며 왜 언제 사용하고 싶습니까?



2
@ bodhi.zazen이 질문의 반대를 다루기 때문에 동일하지는 않지만 매우 유용합니다. 이 질문은 왜 echo쉘 내장으로 제공되는지 묻고 외부 명령으로 제공되는 이유를 묻습니다.
Eliah Kagan

3
한 가지 이유는 모든 사람이 bash를 사용하지 않기 때문입니다. 나는 / bin / echo가 bash보다 오래되었다고 추측하고 개발자는 실행 파일을 사용하는 대신 내장으로 포함시키는 것이 유용하고 효율적이라는 것을 알았습니다.
jamesqf

답변:


88

bash프롬프트 를 열고 echo명령을 입력하면 실행하지 않고 내장 쉘 을 사용합니다 /bin/echo. 여전히 /bin/echo존재 해야하는 이유 는 다음과 같습니다.

  1. 항상 쉘을 사용하는 것은 아닙니다. 다양한 상황에서 실행 파일을 셸이 아닌 직접 실행합니다.
  2. 적어도 이론적으로 일부 껍질에는 echo내장 기능 이 없습니다 . 실제로는 필요하지 않습니다.

# 1을 확장하려면, 당신은 누구의 이름으로 시작하는 모든 일반 파일 이동 싶어한다고 가정 abc어느 곳에서 src에를 dest. 여러 가지 방법이 있지만 그 중 하나는 다음과 같습니다.

find src -name 'abc*' -type f -exec mv -nv {} dest/ \;

그러나 단순히 실행하는 것이 아니라 먼저 실행될 모든 명령을보고 싶다고 가정하십시오. echo다른 상황에서와 마찬가지로 명령 앞에 추가 할 수 있습니다.

find src -name 'abc*' -type f -exec echo mv -nv {} dest/ \;

그러나 find쉘을 사용하지 않습니다. 실행됩니다 /bin/echo.

게다가 find-exec또는-execdir/bin/echo실행 파일 자체가 아니라 쉘을 통해 프로그램을 실행하는 다른 프로그램에 의해 호출됩니다. 이 발생xargs(이 명령 관련find뿐만 아니라, 다른 상황의 숫자에) 라인파일 . 또 다른 예는을 실행할 때인 데 , 작동 중인지 테스트하는 데 유용 할 수 있습니다 .Exec=.desktopsudo echosudo

마찬가지로 일부 쉘에는 printf내장 기능이 있지만 /usr/bin/printf존재합니다.

의도적으로 사용할 수있는 덜 일반적인 이유 /bin/echoecho쉘이 제공 하는 명령 과 명령 의 차이점에 의존하는 경우 입니다. man echo서류 /bin/echo; help echo에서 bash 기록한 bash내장. echo운영 체제와 동일한 운영 체제의 셸에서 서로 다른 구현이 서로 다른 옵션 (예 :)을 지원-e 하고 백 슬래시 처리 방식이 다르기 때문에 이식성이 떨어 집니다. 물론 그러한 세부 사항에 의존하지 않고 훨씬 이식성이 뛰어난printf 대신 사용하는 것이 좋습니다 .

에서 bash당신이 할 수 있습니다, type내장 쇼 /bin/echo뿐만 아니라 - 가정하기 /bin에 당신 $PATH은 항상해야으로 -에 의해 그것을 통과 -a플래그를 :

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

21
또한 POSIX 사양 에는 하나가 있어야한다고 말했기 때문 입니다.
glenn jackman

4
@glennjackman 나는 누군가가 그것에 대해 실제로 답변을 게시하기를 바랐으며, 그렇게하기로 결정했습니다! 도 데비안, 우분투,도 GNU로 coreutils (도 전체 GNU 프로젝트)으로하지만, 관련된 몇 가지 미묘한에 POSIX를 준수하려고 거기에 모든 것이 . 예를 들어, POSIX는 cd실행 파일이 존재하며 ( 실행 시 디렉토리를 변경하고 종료하여 호출자를 이전 위치로 남겨 둠) 일부 OS에는 하나가 있다고 주장합니다. GNU 표준에서 4.1 을 인용하는 것이 도움이 될 수 있습니다 .
Eliah Kagan

@EliahKagan : Incidentaly / usr / bin / cd에는 다음이 사용됩니다. / usr / bin / cd directory 명령은 해당 디렉토리에서 해당 명령을 실행합니다. 디렉토리 변경이 실패하면 명령이 시작되지 않습니다.
Joshua

4
@Joshua의 더 나은 사용법 cd은 단순히 주어진 디렉토리에 액세스하는 능력을 테스트하는 것입니다. /usr/bin/cd some/dir성공한 경우 한 번에 테스트했습니다 .a ) some/dir존재합니다. 해당 디렉토리에 액세스하는 데 필요한 권한이 있습니다. 자신의 상태를 바꾸지 않고
muru

1
@CarlWitthoft, 에코보다 printf가 더 나은 이유를 참조하십시오 . 또한, 그건 /bin/echo아니, \bin\echoWindows를 사용하지 않는. ;)
와일드 카드

31

엘리아는 이에 대한 답변을 많이했지만 " echo배쉬 프로그램 과 다른 버전이 왜 다른가"에 대해 언급하고 싶습니다 . 그건 잘못된 질문입니다.

올바른 질문은 : 왜 이것이 완벽하게 훌륭한 외부 명령이되었을 수 있었을 때 처음에 내장 된 것 입니까?

간단하게하기 위해, 38에서 굵은 선으로 된 대시를 살펴보십시오 (bash는 61로, 출력은 compgen -b).

.               continue        getopts         readonly        type
:               echo            hash            return          ulimit
[               eval            jobs            set             umask
alias           exec            kill            shift           unalias
bg              exit            local           test            unset
break           export          printf          times           wait
cd              false           pwd             trap
command         fg              read            true

얼마나 많은 이들이 필요 내장 매크로로? [, echo, false, printf, pwd, test, 그리고 true하지 않습니다 필요가 내장 명령으로 : 그들은 단지 내장이 할 수있는 일을하지 않는다 (영향을 미치거나 외부 명령에 사용할 수없는 쉘 상태를 얻을). Bash printf는 최소한 내장 기능을 활용 printf -v var합니다 var. 출력을 변수에 저장합니다 . timebash는 또한 특별합니다. 키워드를 사용하면 bash에서 임의의 명령 목록에 시간을 지정할 수 있습니다 (대시에는 time동등한 것이 없습니다 ). pwd내장 명령 일 필요는 없습니다. 외부 명령은 현재 작업 디렉토리를 상속받습니다 (또한 외부 명령 이기도 함).:예외입니다-NOP가 필요 :합니다. 나머지는 외부 명령으로 쉽게 수행 할 수있는 작업을 수행합니다.

따라서이 내장의 5 분의 1은 내장 할 필요가 없습니다. 그땐 왜? 맨 페이지 * 실제로 이러한 내장 명령 (강조 광산) 왜 지나가는 설명 :dash

내장
 이 섹션에는 내장 명령이 나열되어 있습니다.
 별도의 작업으로는 수행 할 수없는 작업을 수행해야합니다.
 방법. 이 외에도 몇 가지 다른 명령이있을 수 있습니다.
 효율성을 위해 내장되어 있어야합니다 (예 : printf (1), echo (1), test (1) 등).

이 내장은 대화식으로 그리고 스크립트에서 자주 사용되며 기능이 단순하여 쉘이 작업을 수행 할 수 있기 때문에 매우 간단합니다. 그리고 일 : 일부 (? 대부분의) 껍질이 일에했다 ** 다시 돌아갑니다. 에서 2.9 BSD , 당신은 찾을 수 없을 것이다 내장을.shecho

따라서 최소한의 쉘이 내장 명령과 같은 명령을 건너 뛸 수 있다는 것이 전적으로 가능합니다 (그러나 현재 쉘은 그렇게 생각하지 않습니다). GNU coreutils 프로젝트는 특정 쉘에서 실행한다고 가정하지 않으며 POSIX에는 이러한 명령이 필요합니다. 따라서 coreutils는 어쨌든 이러한 기능을 제공하며 셸 외부에서 의미가없는 것을 생략합니다.


* 이것은 Almquist 쉘에 해당하는 맨 페이지 텍스트와 거의 동일 합니다. 데비안 Almquist 쉘은 대시를 기반으로합니다.

** zsh극단적 인이 생각한다 : 다양한 모듈을로드하여 얻을 명령을 같은 zmv, 당신도 들어갈 필요는 쉘을 생각하지 않을 것입니다 . 그 시점에서 실제 질문은 다음과 같습니다. 왜 이러한 모든 내장 기능이있는 zsh 대신 bash를 사용합니까?


1
그것은 : 내장 될 필요가 없다는 것이 밝혀졌습니다. 내장되지 않은 것은 어리석은 일입니다. 초기 init rescue-floppy-disk 수준의 문제를 다루지 않는 한 (내가 pwd가 안정적으로 작동하지 않는다는 것을 알게 된 경우) 이것을 내장형으로 사용하지 않은 유일한 페널티는 끔찍한 성능입니다.
Joshua

5
@Joshua 아니요, :외부는 실제로 NOP가 아니기 때문에 PATH원하는 것은 명시 적으로 아무것도하지 않는 경우 에도 조회, 명령 실행 시도 등이 있습니다. :내장으로 그렇게합니다.
muru

2
pwd"논리"경로 ( pwd -L) 를 표시하는 기본 동작과 함께 Bash는 실제로 작동 방식으로 작동하기 위해 기본 제공되어야합니다 . 당신이 겪은 심볼릭 링크가 아닌 실제 부모 디렉토리를 보여주는 행동 /bin/pwd만 구현할 수 pwd -P있습니다 cd.
Peter Cordes 17

2
@PeterCordes pwd의 상태의 존재에 의해 훼손 약간입니다 PWD만, 예, 그 또한 기능 향상을 위해 내장 상태를 사용하여 배쉬의 인스턴스입니다
muru
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.