set
및 shopt
는 모두 다양한 기능을 제어하는 셸 내장 기능입니다. 옵션. 어떤 옵션이 어떤 명령으로 설정되고 어떤 옵션이 설정 / 설정 해제되는지 종종 잊어 버립니다 (set -o/+o
, shopt -s/-u
). 겉보기에 동일한 작업을 수행하는 두 개의 다른 명령이있는 이유는 무엇입니까? 어떤 옵션이 어떤 명령과 함께 사용되는지 기억할 수있는 쉬운 방법 / 기억법이 있나요?
설명
답변
내가 아는 한 옵션은 다른 Bourne 스타일 셸 (대부분 ksh)에서 상속 된 옵션이고 shopt
옵션은 bash에만 해당하는 옵션입니다. 내가 아는 논리가 없습니다.
댓글
-
shopt
를 보여주는 문서는 상속? - 음,
posix
/physical
와 같은set -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와 연결하려고합니다. .
답변
-
set
POSIX 7 : set-옵션 및 위치 매개 변수 설정 또는 설정 해제 | pubs.opengroup.org -
shopt
는 다음이 아닙니다. 셸 & 유틸리티 : 자세한 Toc | pubs.opengroup.org
아마 @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) 에서 는 하위 셸에 상속되지 않습니다.
set
및shopt
옵션은 모두 하위 셸에 상속되지 않습니다. -
set
및shopt
둘 다의 상속 특성을 설명하는 문서를 가리킬 수 있습니까? - 둘 다
set -o
및shopt
옵션은 하위 셸 ((...)
, , 파이프 라인 구성 요소). 다른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 $
help set
및help shopt
는 작성자도 동일한 작업을한다고 생각하는지 확인합니다.