세트와 쇼핑-왜 두?


72

set그리고 shopt다양한 옵션을 제어 모두 쉘 내장 명령입니다. 어떤 명령이 어떤 명령으로 설정되고 어떤 옵션이 설정 / 설정 해제 ( set -o/+o, shopt -s/-u) 되는지 종종 잊어 버립니다 . 겉보기에 똑같은 일을하는 두 개의 다른 명령이있는 이유는 무엇입니까? 어떤 옵션이 어떤 명령과 함께 사용되는지 기억하는 쉬운 방법 / 니모닉이 있습니까?


6
의 두 번째 줄을보고 시도 help set하고 help shopt심지어 저자들이 같은 일을 생각 있는지 확인합니다.
l0b0

2
"쉘 속성 값 변경"대 "각 쉘 옵션의 설정 변경".
케빈

2
Bash 4.1.5 (1)-릴리스에서는 "쉘 옵션 및 위치 매개 변수의 값을 설정 또는 설정 해제합니다."라고 표시합니다. 및 "쉘 옵션 설정 및 설정 해제".
l0b0

맨 페이지를 작성하면 모르는 내용을 알 수 있으며 글을 쓰려는 것에 대해 틀리지 않은 방식으로 사물을 공식화 할 수 있습니다.
sjas

답변:


40

내가 아는 한 set -o옵션은 다른 Bourne 스타일 쉘 (주로 ksh)에서 상속 된 shopt옵션이며 bash에만 적용 되는 옵션입니다. 내가 아는 논리는 없습니다.


1
표시되는 모든 문서 shopt는 상속됩니까?
Felipe Alvarez

8
음, 거기에 set -o같은 옵션은 posix/ physical/ interactive-comments에없는 것을 ksh, 그리고 shopt포함한 다른 쉘에있는 것과 ksh같은 일부 login_shell/가 nullglob. 당신이 말했듯이 논리는 없습니다. 아마도 SHELLOPTS가 표준이고 bash 고유의 제품을 구매하는 것이 처음에는 아이디어 였지만 그 과정에서 길을 잃었으므로 이제는 성 가시고 UI 디자인이 실패했습니다.
Stéphane Chazelas

22

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


9
어! 더 혼란 스럽습니다. 내 뇌는 $ BA SHOPT S가 아닌 shopt$ SH ELL OPT S 와 연관되기를 원합니다 .
Bruno Bronosky


8

쉽지만 역사상 잃어 버렸습니다. 이 set명령은 원래 원래 유닉스 쉘의 명령 줄 환경을 수정하는 데 사용되었습니다 /bin/sh. 그런 다음 다양한 유닉스 버전이 발전하고 새로운 셸 맛이 추가됨에 따라 사람들은 셸 스크립팅 호환성을 유지하기 위해 더 많은 (환경) 항목을 변경할 수 있어야한다는 것을 깨달았습니다. 그 당시 배쉬는 매우 인기가있어 및 추가 엘의 옵트의 이온 도입, 필요했다 shopt.

실제로 명령 에서 이러한 호환성 시도를 볼 수 있습니다 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

2
set옵션을 설정하는 방법은 원래 유닉스 쉘에는 없었으며, 70 년대 후반 Bourne 쉘에 의해 소개되었습니다. set -o name그 자체는 나중에 Korn 쉘에 의해 추가되었지만 POSIX에서는 옵션이지만 선택 사항이지만 Solaris 10 과 같은 Bourne 쉘의 "현대" 버전 에서는 여전히 지원되지 않습니다 /bin/sh.
Stéphane Chazelas

5

"Bash를 이용한 리눅스 쉘 스크립팅", p 63 :

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


3

"세트"옵션은 서브 쉘에 의해 상속되는 것으로 보이지만 쇼핑객은 그렇지 않습니다.


잘 잡았다. 이것이 의도적 인 선택인지 아니면 부작용인지 궁금합니다.
Kevin

2
@ 적어도 아래 user29778 떠들썩한 파티 4.1.5 (1) 로 설정 한 옵션 setsubshells.Both 상속되지 setshopt옵션 서브 쉘 상속되지 않는다.
Martin

set및 의 상속 특성을 설명하는 문서를 가리킬 수 있습니까 shopt?
Felipe Alvarez

9
모두 set -oshopt옵션은 서브 쉘 (상속 (...), $(...)파이프 라인 구성 요소). 그들은 다른 상속 여부 bash호출 여부에 따라 SHELLOPTS또는 BASHOPTS환경 여부에 있습니다.
Stéphane Chazelas

0

setbourne shell (sh)에서 시작하여 POSIX 표준의 일부 shopt이지만 bourne-again shell (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

$ 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.