Set and Shopt-Why Two?

setshopt는 모두 다양한 기능을 제어하는 셸 내장 기능입니다. 옵션. 어떤 옵션이 어떤 명령으로 설정되고 어떤 옵션이 설정 / 설정 해제되는지 종종 잊어 버립니다 (set -o/+o, shopt -s/-u). 겉보기에 동일한 작업을 수행하는 두 개의 다른 명령이있는 이유는 무엇입니까? 어떤 옵션이 어떤 명령과 함께 사용되는지 기억할 수있는 쉬운 방법 / 기억법이 있나요?

설명

  • help sethelp shopt는 작성자도 동일한 작업을한다고 생각하는지 확인합니다.
  • " 셸 속성 값 변경 " 대 " 각 셸 옵션 설정 변경 ".
  • Bash 4.1.5 (1) 릴리스에서는 " 셸 옵션 및 위치 매개 변수의 값을 설정하거나 설정 해제합니다. " 및 " 쉘 옵션을 각각 설정 및 설정 해제합니다. "
  • 쓰기 맨 페이지는 자신이 모르는 것을 깨닫게하고 작성하려는 내용에 대해 틀리지 않은 방식으로 공식화하도록합니다.

답변

내가 아는 한 옵션은 다른 Bourne 스타일 셸 (대부분 ksh)에서 상속 된 옵션이고 shopt 옵션은 bash에만 해당하는 옵션입니다. 내가 아는 논리가 없습니다.

댓글

  • shopt를 보여주는 문서는 상속?
  • 음, posix / physicalset -o 옵션이 있습니다. ksh에없는 div> / interactive-comments 및 기타에있는 shopt login_shell / nullglob와 같은 일부에 대해 ksh를 포함하는 셸입니다. 말씀하신 것처럼 ' 논리가 없습니다. 아마도 처음에는 SHELLOPTS가 표준이고 BASHOPTS는 BASHOPTS라는 아이디어 였을 것입니다. 귀찮은 UI 디자인 실패로 끝납니다.

답변

차이점은 변경된 환경 변수에 있습니다. bash에서 사용합니다. set 명령으로 설정하면 . shopt 명령으로 설정하면 $BASHOPTS가됩니다.

댓글

  • 앗! 그것은 훨씬 더 혼란 스럽습니다. 내 두뇌는 shopt를 $ BA SHOPT S가 아닌 $ SH ELL OPT S와 연결하려고합니다. .

답변

아마 @Gilles가 언급 한 역사와 연결되었을 것입니다.

답변

쉽지만 역사상 길을 잃었습니다. set 명령은 원래 원래 UNIX 셸 . 그런 다음 다양한 Unix 버전이 발전하고 새로운 셸 버전이 추가됨에 따라 사람들은 셸 스크립팅 호환성을 유지하기 위해 더 많은 (환경) 항목을 변경할 수 있어야한다는 것을 깨달았습니다. 그 당시 Bash는 매우 인기를 얻었으며 추가 sh ell 옵션 이온이 필요하여 shopt를 도입했습니다.

실제로 이러한 compat shopt 명령에서 가능성을 시도합니다.

$ shopt autocd off cdable_vars off cdspell off checkhash off checkjobs off checkwinsize off cmdhist on compat31 off compat32 off compat40 off compat41 off compat42 off complete_fullquote on direxpand off dirspell off dotglob off execfail off expand_aliases on extdebug off extglob off extquote on failglob off force_fignore on globstar off globasciiranges off gnu_errfmt off histappend on histreedit off histverify off hostcomplete on huponexit off interactive_comments on lastpipe off lithist off login_shell on mailwarn off no_empty_cmd_completion off nocaseglob on nocasematch off nullglob off progcomp on promptvars on restricted_shell off shift_verbose off sourcepath on xpg_echo off 

그러나 set 명령에는 없습니다.

$ set -o allexport off braceexpand on emacs on errexit off errtrace off functrace off hashall on histexpand on history on igncr off ignoreeof off interactive-comments on keyword off monitor on noclobber off noexec off noglob off nolog off notify off nounset off onecmd off physical off pipefail off posix off privileged off verbose off vi off xtrace off 

댓글

  • set 옵션을 설정하는 방법은 다음과 같습니다. ' t는 원래 Unix 셸에서 70 년대 후반 Bourne 셸에 의해 도입되었습니다. set -o name 자체는 나중에 Korn 셸에 의해 추가되었지만 POSIX에서는 선택 사항이지만 여전히 " 현대 iv id에서는 지원되지 않습니다. Solaris 10의 /bin/sh와 같은 Bourne 쉘의 = “583b4a846f”>

버전.

Answer

“Linux Shell Scripting with Bash”책에서 발췌 : 63 페이지 :

역사적으로 set 명령은 옵션을 켜고 끄는 데 사용되었습니다. 옵션 수가 증가함에 따라 옵션이 단일 문자 코드로 표시되기 때문에 set 사용이 더욱 어려워졌습니다. 결과적으로 Bash는 shopt ( 셸 옵션 ) 명령을 제공하여 문자 대신 이름별로 옵션을 켜고 끕니다. 특정 옵션은 문자로만 설정할 수 있습니다. 다른 기능은 shopt 명령에서만 사용할 수 있습니다. 이로 인해 특정 옵션을 찾고 설정하는 것은 혼란스러운 작업입니다.

답변

“설정”옵션이 하위 셸에 상속 된 것 같습니다. 쇼핑객은 그렇지 않습니다.

댓글

  • 잘 잡았습니다. 이것이 의도적 인 선택인지 부작용인지 궁금합니다.
  • @ user29778 적어도 bash 4.1.5 (1) 에서 는 하위 셸에 상속되지 않습니다. setshopt 옵션은 모두 하위 셸에 상속되지 않습니다.
  • setshopt 둘 다의 상속 특성을 설명하는 문서를 가리킬 수 있습니까?
  • 둘 다 set -oshopt 옵션은 하위 셸 ((...), , 파이프 라인 구성 요소). 다른 bash 호출에 의해 상속되는지 여부는 SHELLOPTS 또는 BASHOPTS가 환경 여부.

답변

set는 bourne 셸 (sh)이며 POSIX 표준의 일부이지만 shopt는 bourne-again 셸 (bash)에만 해당됩니다.

0 sjas@ssg 14:31:45 ~ set | grep -e SHELLOPTS -e BASHOPTS BASHOPTS=checkwinsize:cmdhist:complete_fullquote:dotglob:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:progcomp:promptvars:sourcepath SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor 0 sjas@ssg 14:31:51 ~ shopt | column -t | grep -v off checkwinsize on cmdhist on complete_fullquote on dotglob on expand_aliases on extglob on extquote on force_fignore on histappend on interactive_comments on progcomp on promptvars on sourcepath on 0 sjas@ssg 14:31:57 ~ set -o | column -t | grep -v off braceexpand on emacs on hashall on histexpand on history on interactive-comments on monitor on 0 sjas@ssg 14:37:41 ~ sh $ set -o Current option settings errexit off noglob off ignoreeof off interactive on monitor on noexec off stdin on xtrace off verbose off vi off emacs off noclobber off allexport off notify off nounset off priv off nolog off debug off $ shopt sh: 3: shopt: not found $ 

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다