bash-as-sh 에코 -n

bash-as-sh 에코 -n

bash(중요한 경우 버전 3.2.57(1))가 sh 를 에뮬레이트하는 모드에서 내장 -n옵션을 구현하도록 하는 방법이 있습니까 echo?

echo -n특히 , M개의 다른 스크립트에서 N개의 호출을 찾아 다시 작성하는 대신 수년 동안 잘 작동해 온(어쩌면 단지 불운일 수도 있음) 어딘가에 설정할 수 있는 옵션이 있는지 궁금합니다 . 분명히 bash의 내장 함수는 echo 이것을 할 수 있습니다 -n. 왜냐하면 전체 bash 모드에서는 가능하기 때문입니다.

echo -n[면책 조항: 예, 처음에는 이식성이 없다는 것을 알고 있지만 printf권장됩니다. ]


참고 사항: 한 논평가는 이 bash 버전이 "17년 전"이라고 지적했습니다. 누군가 이 사실을 Apple에 알려야 합니다. 이것은 제가 새로 구입한 Mac에 설치된 MacOS Ventura 13.0과 함께 제공되는 버전입니다.

답변1

내가 생각해 낼 수 있는 가장 좋은 아이디어는 내장 기능을 GNU coreutils의 echo"실제" 실행 파일로 바꾸는 것입니다. 이는 bash가 있는 경우 거의 확실하게 설치되어 있습니다.echo

echo() { "$(type -P echo)" "$@" ; }

내장된 항목을 숨길 뿐입니다.

GNU Coreutil은 echo.c실제로 그리 길지 않기 때문에 "나는 UNIX System V에서 실행 중인데 이 동작이 예상됩니까?"와 같은 특수한 경우 처리, --help인쇄 및 유사한 작업이 큰 부분을 차지합니다.엄격하게필요한 경우 쉘 스크립트에 작은 C 구현을 포함 echo하고 POSIX 지정 수단을 통해 이를 넣는 것을 고려할 수 있습니다( c99구현한 적이 있는 경우). 도대체 이것은 2000년대의 기계이므로 Perl이 있다고 가정하고 Perl에서 동일한 기능을 구현하는 것이 좋습니다.

답변2

본 것처럼왜 printf가 echo보다 나은가요?, 동시에 활성화된 경우(예: 호출 시) 및 이 옵션이 활성화된 경우(bash가 UNIX 호환되도록 구축된 시스템의 기본값으로) bash이 옵션은 지원되지 않습니다 ( / -n도 마찬가지입니다 ) .-e-Eposixshxpg_echo

따라서 bash (및 / 및 그 조합, 예를 들어 ... )에 대한 echo지원을 받으려면 이러한 옵션 중 하나 또는 둘 다를 비활성화해야 합니다. 이 이상으로 UNIX 호환성을 유지 하려면 이 기능을 꺼야 할 수도 있습니다 .-n-e-Eecho -enecho -e -nsh-nxpg_echo

shopt -u xpg_echo

예:

$ bash -o posix -O xpg_echo -c 'echo -n a'
-n a
$ bash -o posix -O xpg_echo -c 'shopt -u xpg_echo; echo -n a'
a

-nbash는 인쇄되지 않은 항목을 제외하면 여전히 대부분 UNIX와 호환됩니다 .

$ bash -o posix -O xpg_echo -c 'set +o posix; echo -n a'
a

이 처리는 활성화되지만 -n일부 다른 비 UNIX 준수도 활성화되므로 표준과 덜 유사하게 작동합니다 sh.

답변3

내 Mac의 외부 장치는 /bin/echo이를 지원합니다 -n. 다음을 사용하여 Bash 내장 기능을 비활성화할 수 있습니다 enable -n.

bash-3.2$ enable -n echo
bash-3.2$ type echo
echo is /bin/echo
bash-3.2$ echo -n foo |od -c
0000000    f   o   o
0000003

답변4

근본적인 문제를 해결하라

"upgrade bash macOS"를 검색어로 사용하면 Google은 많은 결과를 반환합니다. 현지 교환 답변을 사용하고 2개의 답변을 하나로 병합합니다(참고 사항에 따라).

GNU 라이센스에 관해 자주 묻는 질문: Tivoization

사람들이 GPLv3에 따른 소프트웨어가 포함된 사용자 제품을 배포할 때 섹션 6에서는 소프트웨어 수정에 필요한 정보를 제공하도록 요구합니다. 사용자 제품은 라이센스에 구체적으로 정의된 용어입니다. 사용자 제품의 예로는 휴대용 음악 플레이어, 디지털 비디오 레코더 및 홈 보안 시스템이 있습니다.

Apple의 Darwin OS는 약 10.5부터 비공개 소스였기 때문에 업그레이드된 BASH를 제공하는 것은 위 단락을 위반하는 것이므로 Apple은 알고 있습니다. BASH 셸을 업데이트하고 기본 셸로 만드는 방법이 있습니다.

Homebrew를 통해 업데이트된 Bash 설치

다음을 터미널에 붙여넣으세요.

  1. /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"라인으로.
  2. 질문brew install bash

Homebrew에 BASH의 업데이트된 버전을 설치한 다음 이를 심볼릭 링크해야 합니다. which bash기본 위치로 설정하려는 위치를 찾는 데 사용됩니다 .

  1. 편집하다 /etc/shells.
  2. 파일 끝에 경로 + 바이너리를 추가합니다.
  3. 환경을 업데이트하려면 로그아웃했다가 다시 로그인하세요.
  4. "Change Shells" 명령을 사용하여 chsh새 BASH 버전에 대한 경로를 제공합니다. 그러면 새 버전이 기본 쉘이 됩니다.

원천

관련 정보