에코 "bar"-n이 에코 -n "bar"와 다른 이유는 무엇입니까?


10

비교

echo -n "bar"

echo "bar" -n

전자는 내가해야 한다고 생각하는 것을 수행하지만 (줄 바꿈없이 "바"로 인쇄) 후자는 그렇지 않습니다. 이것은 버그입니까 아니면 의도적 인 것입니까? 옵션을 옮길 수 없다는 점에서 많은 cli 프로그램과 다른 이유는 무엇입니까? 예를 tail -f /var/log/messages들어와 정확히 동일합니다 tail /var/log/messages -f. 내부적으로 옵션과 인수가 일반적으로 getopt에 의해 재 배열되기 때문에 내가 전자를 원했던 것을 잊었을 때 후자를 수행하는 경우가 있습니다 .

업데이트 : 예 나는 원래 내 질문을 신경 쓰지 않았습니다. 나는 당신이 대답을 이해하기 위해 역사를보아야 할 신경을 제거했습니다.


3
내가 본 것에서 그 차이 즉시 명백하다. echo -n "bar""bar"를 echo "bar" -n제공 하는 동안 "bar -n" 을 제공
phunehehe

답변:


18

대부분의 다른 사람들이 관찰했듯이 "-n"은 echo명령 바로 다음에 아무 곳에 나 배치하면 문자 그대로 해석됩니다 .

역사적으로 UNIX 유틸리티는 모두 이와 같았습니다. 명령 이름 바로 뒤에있는 옵션 만 찾았습니다. POSIX가 이전 방식을 올바른 것으로 지정 했으므로 (유선하지 않을 수도 있음)보다 유연한 스타일을 개척 한 BSD 또는 GNU 일 가능성이 높습니다 (가이드 라인 9 및 man 3 getoptLinux 시스템 참조). 어쨌든, 요즘 대부분의 리눅스 유틸리티가 새로운 스타일을 사용하지만,와 같은 일부 유인물이 echo있습니다.

EchoPOSIX가 등장 할 때까지 근본적으로 상충되는 버전이 두 개 이상 존재했다는 점에서 표준 측면에서 엉망 입니다. 한편으로는 백 슬래시 이스케이프 문자를 해석하지만 인수를 문자 그대로 처리하고 옵션을 허용하지 않는 SYSV 스타일이 있습니다. 다른 한편으로, 당신은 BSD 스타일을 가지고 있는데, 이것은 이니셜 -n을 특별한 경우로 취급하고 문자 그대로 다른 모든 것을 절대적으로 출력합니다. 그리고 echo매우 편리하기 때문에 하나의 동작에 의존하는 수천 개의 쉘 스크립트가 있습니다.

echo Usage: my_awesome_script '[-a]' '[-b]' '[-c]' '[-n]'
echo -a does a thing.
echo -b does something else.
echo -c makes sure -a works right.
echo -- DON\'T USE -n -- it\'s not finished! --

"모든 것을 문자 그대로 처리"하는 의미 때문에, 문제를 echo일으키지 않고 새로운 옵션을 추가하는 것조차 불가능합니다 . 만약 GNU가 그것에 유연한 옵션 체계를 사용한다면, 지옥은 풀릴 것입니다.

덧붙여, Bourne 쉘 구현 사이의 최적의 호환성을 위해 사용 printf하기보다는echo .

echo특히 유연한 옵션을 사용하지 않는 이유를 설명하기 위해 업데이트 되었습니다 .


당신이 예상되는 getopt 행동이라고 언급 한 유일한 사람이기 때문에 공감하십시오.
Geoffrey Bachelet

@jander 왜 에코가 "유지 점"입니까? 나는 그것이 gnu coreutil이라고 생각합니까?
xenoterracide

@ xeno : 내 대답을 업데이트했습니다. 기본적으로 GNU는 문제를 해결하고 싶지 않았습니다.
Jander

1
첫 번째 옵션이 아닌 옵션을 수락하는 것은 GNU libcgetopt 기능을 사용 하는 GNU 유틸리티 및 프로그램에 따라 다릅니다 . 사용자는 환경 변수를 설정하여 항상 이전 버전과 호환되는 동작을 얻을 수 있습니다 POSIXLY_CORRECT.
Gilles 'SO- 악마 그만해'

1
의 경우에는 옵션 echo을 인식 -e하거나 -E옵션으로 구현하는 것도 있습니다. 이식성을 위해로 시작 -하거나 같은 것을 사용 하지 마십시오 printf %s -e.
Gilles 'SO- 악마 그만해'

9

다른 답변은 매뉴얼 페이지에서 -n이 반향 할 문자열의 일부가되고 있음을 알 수 있습니다. 그러나 나는 단지 md5sum없이 이것을 조사하는 것이 쉽고 약간 덜 비밀스러운 것을 만듭니다.

[11:07:44][dasonk@Chloe:~]: echo -n "bar"
bar[11:07:48][dasonk@Chloe:~]: echo "bar" -n
bar -n

3
정확히 +1 파이프 라인이 예상대로 작동하지 않으면 각 부품을 개별적으로 테스트하십시오.
Mikel

6

와우, 모든 사람의 설명은 길다.

이 간단합니다 :

-n 문자열 앞에 나타나는 경우 옵션입니다. 그렇지 않으면 에코 될 다른 문자열 일뿐입니다.

를 제거하면 | md5sum 출력이 다르다는 것을 알 수 있습니다.


5

간단한 검사에서 이것은 의도적으로 버그가 아닙니다 ...

echo "bar" -n | md5sum

a3f8efa5dd10e90aee0963052e3650a1

이 명령을 직접 사용해보십시오.

echo "bar -n" | md5sum

결과 md5가

a3f8efa5dd10e90aee0963052e3650a1

에코에서 -n 사용을 혼합했습니다.

첫 번째 샘플 코드에서

echo -n "bar" | md5sum

-n은이 에코 다음에 줄 바꾸기를하지 말라고 말합니다.

두 번째 샘플

echo "bar" -n | md5sum

-n을 리터럴 텍스트로 취급합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.