잘린 긴 명령줄 옵션을 허용하는 이유는 무엇입니까?

잘린 긴 명령줄 옵션을 허용하는 이유는 무엇입니까?

많은 명령줄 유틸리티는 긴([1]에 따르면 "GNU 스타일") 옵션을 허용합니다 --version. 놀랍게도 잘린 버전은 전체 옵션으로 해석되는 경우가 많습니다. 예를 들어, dfGNU Coreutils는 다음을 제공합니다.

user@computer ~ $ df --version
df (GNU coreutils) 8.32
Packaged by Gentoo (8.32-r1 (p0))
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Torbjorn Granlund, David MacKenzie, and Paul Eggert.

--version--v잘림 변형 , --ve, --ver--vers을 바꾸면 --versi동일한 출력을 얻을 수 있습니다 --versio. 그러나 옵션에 문자를 추가하면 갑자기 해당 옵션이 유효하지 않다는 사실이 인식됩니다.

user@computer ~ $ df --versionn
df: unrecognized option '--versionn'
Try 'df --help' for more information.

이 동작은 의도적인 것인가요? 그 이유는 무엇입니까? 내 이해는 대부분의 유틸리티가 getopts또는 getopt(또는 유사한)에 의존한다는 것입니다. 그래서 맨페이지에서 단서를 찾았지만 설명을 찾지 못했습니다.

[1] ES 레이먼드.UNIX 프로그래밍의 기술. 피어슨 교육, Inc., 2004

답변1

요점은 타이핑을 저장하는 것입니다. 예를 들어, ls --col|less -R철자를 쓰지 않고도 입력할 수 있습니다 ls --color.

(아니요, 참고 자료를 찾을 수 없습니다. 놀랍게도,getopt_long문서...도 아니다GNU 코딩 표준. 나는 이것이 민속이라고 주장합니다. )

범용 쉘에서 긴 옵션 완성을 지원하는 것은 더 이상 유용하지 않지만 명령의 사용자 정의 완성 지원은 자동이 아니며 bash(GNU 쉘)의 사용자 정의 완성 지원은 getopt_long약 20년 후에 구현되었습니다(1980년대 초~ 1990년대 후반 IIRC).

답변2

도움을 주려는 문제의 기능 외에 다른 것이 관련되어 있는지 의심됩니다. 대화형 사용에서는 사용자가 게으르지 않도록 유틸리티에서 약어를 허용하는 것이 도움이 될 수 있습니다.

이건 문제야포스텔의 법칙(즉, "받는 것에는 관대하되 내보내는 것에는 엄격하라") 그리고 관용은아니요사람들의 습관적인 행동이 미래 변화 가능성에 영향을 미치기 때문에 항상 따라야 할 좋은 규칙입니다. 이 경우 향후 옵션으로 인해 이전에 유효한 약어가 무효화될 수 있지만 스크립트 작성자가 시간을 내어 옵션을 완전히 설명하는 한 문제가 발생할 위험은 적습니다. 대화형 사용자는 업그레이드 후 오류가 발생하면 명령을 쉽게 수정할 수 있다고 가정할 수 있으므로 약어를 더 쉽게 사용할 수 있습니다.

축약된 스크립트를 사용하는 것은 실제로 문제가 될 수 있으며 이러한 문제를 피하기 위해 논쟁이 있을 것입니다.아니요입력에 관대하십시오. 그러나 분명히 이 경우에는 라이브러리 작성자가 약어를 허용하기로 선택한 것은 괜찮습니다.

관련 정보