비교하다
echo -n "bar"
그리고
echo "bar" -n
전자는 무엇을 하는가?나이 작업(줄 바꿈 없이 "바" 인쇄)을 수행해야 한다고 생각하지만 그렇지 않습니다. 이것은 버그입니까, 아니면 의도된 것입니까? 많은 CLI 프로그램과 달리 옵션을 이동할 수 없는 이유는 무엇입니까? 예를 들어 tail -f /var/log/messages
와 정확히 동일합니다 tail /var/log/messages -f
. 내부적으로 옵션과 매개변수가 종종 재배치되기 때문에 전자를 원하는 것을 잊었을 때 후자를 수행하는 경우가 있습니다.선택 항목 가져오기.
고쳐 쓰다:예, 처음에는 질문을 약화시켰습니다. 일부 답변을 이해하기 위해 기록을 살펴봐야 한다는 너프를 제거했습니다.
답변1
대부분의 다른 사람들이 관찰했듯이 "-n"이 명령 뒤가 아닌 다른 곳에 배치되면 문자 그대로 해석됩니다 echo
.
역사적으로 UNIX 유틸리티는 이와 같았습니다. 즉, 명령 이름 바로 다음에 있는 옵션만 찾습니다. BSD나 GNU가 더 유연한 스타일을 개척했을 가능성이 높습니다(비록 제가 틀렸을 수도 있지만).POSIX는 이전 방법이 정확함을 지정합니다.(가이드 9 참조 및man 3 getopt
Linux 시스템의 경우). 어쨌든 대부분의 Linux 유틸리티는 이제 새로운 스타일을 사용하지만 echo
.
Echo
표준 관점에서 보면 엉망입니다. 왜냐하면 적어도 다음과 같은 것들이 있기 때문입니다.근본적으로 충돌하는 두 가지 버전POSIX가 탄생했을 때 이미 실행 중이었습니다. 한편으로는 백슬래시 이스케이프 문자를 해석하지만 해당 인수를 문자 그대로 처리하고 옵션을 허용하지 않는 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가 유연한 옵션 체계를 사용했다면 지옥이 풀릴 것입니다.
BTW는 Bourne 쉘 구현 간의 최상의 호환성을 위해printf
대신 사용echo
.
고쳐 쓰다echo
구체적으로 유연한 옵션을 사용하지 않는 이유를 설명하세요 .
답변2
다른 답변은 모두 이것을 지적합니다. 매뉴얼 페이지를 확인하여 -n이 에코될 문자열의 일부가 되고 있음을 확인할 수 있습니다. 그러나 나는 이 문제가 md5sum 없이도 쉽게 조사될 수 있고 무슨 일이 일어나고 있는지 덜 신비롭게 만들 수 있다는 점을 지적하고 싶습니다.
[11:07:44][dasonk@Chloe:~]: echo -n "bar"
bar[11:07:48][dasonk@Chloe:~]: echo "bar" -n
bar -n
답변3
와, 다들 설명이 너무 길네요.
그것은 간단합니다:
-n
문자열 앞에 나타나면 옵션이고, 그렇지 않으면 에코되는 또 다른 문자열입니다.
그것을 제거 | md5sum
하면 출력이 다른 것을 볼 수 있습니다.
답변4
단순하게 살펴보면 설계상의 버그는 아닌데...
echo "bar" -n | md5sum
a3f8efa5dd10e90aee0963052e3650a1
다음 명령을 직접 시도해 보세요.
echo "bar -n" | md5sum
결과 md5는 다음과 같습니다.
a3f8efa5dd10e90aee0963052e3650a1
echo에서 -n 사용을 혼동하고 있습니다.
첫 번째 예제 코드에서
echo -n "bar" | md5sum
-n은 이 에코 뒤에 줄바꿈을 추가하지 않음을 나타내는 데 사용됩니다.
두 번째 샘플
echo "bar" -n | md5sum
-n을 리터럴 텍스트로 처리합니다.