에코 “bar”-n이 에코 -n “bar”와 다른 이유는 무엇입니까? 무엇입니까? 예를 tail

비교

echo -n "bar"

echo "bar" -n

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

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



답변

대부분의 다른 사람들이 관찰했듯이 “-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특히 유연한 옵션을 사용하지 않는 이유를 설명하기 위해 업데이트 되었습니다 .


답변

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

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

답변

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

이 간단합니다 :

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

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


답변

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

echo "bar" -n | md5sum

a3f8efa5dd10e90aee0963052e3650a1

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

echo "bar -n" | md5sum

결과 md5가

a3f8efa5dd10e90aee0963052e3650a1

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

첫 번째 샘플 코드에서

echo -n "bar" | md5sum

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

두 번째 샘플

echo "bar" -n | md5sum

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