set
그리고 shopt
다양한 옵션을 제어 모두 쉘 내장 명령입니다. 어떤 명령이 어떤 명령으로 설정되고 어떤 옵션이 설정 / 설정 해제 ( set -o/+o
, shopt -s/-u
) 되는지 종종 잊어 버립니다 . 겉보기에 똑같은 일을하는 두 개의 다른 명령이있는 이유는 무엇입니까? 어떤 옵션이 어떤 명령과 함께 사용되는지 기억하는 쉬운 방법 / 니모닉이 있습니까?
set
그리고 shopt
다양한 옵션을 제어 모두 쉘 내장 명령입니다. 어떤 명령이 어떤 명령으로 설정되고 어떤 옵션이 설정 / 설정 해제 ( set -o/+o
, shopt -s/-u
) 되는지 종종 잊어 버립니다 . 겉보기에 똑같은 일을하는 두 개의 다른 명령이있는 이유는 무엇입니까? 어떤 옵션이 어떤 명령과 함께 사용되는지 기억하는 쉬운 방법 / 니모닉이 있습니까?
답변:
내가 아는 한 set -o
옵션은 다른 Bourne 스타일 쉘 (주로 ksh)에서 상속 된 shopt
옵션이며 bash에만 적용 되는 옵션입니다. 내가 아는 논리는 없습니다.
shopt
는 상속됩니까?
set -o
같은 옵션은 posix
/ physical
/ interactive-comments
에없는 것을 ksh
, 그리고 shopt
포함한 다른 쉘에있는 것과 ksh
같은 일부 login_shell
/가 nullglob
. 당신이 말했듯이 논리는 없습니다. 아마도 SHELLOPTS가 표준이고 bash 고유의 제품을 구매하는 것이 처음에는 아이디어 였지만 그 과정에서 길을 잃었으므로 이제는 성 가시고 UI 디자인이 실패했습니다.
차이점은 bash가 사용하는 변경된 환경 변수에 있습니다. set
명령으로 설정하면 결과가됩니다 $SHELLOPTS
. shopt
명령으로 설정하면 결과가됩니다 $BASHOPTS
.
shopt
$ SH ELL OPT S 와 연관되기를 원합니다 .
set
POSIX 7 : 설정-설정 또는 설정 해제 옵션 및 위치 매개 변수 | pubs.opengroup.org
shopt
는 아닙니다 : Shell & Utilities : Detailed Toc | pubs.opengroup.org
@Gilles가 언급 한 역사와 관련이있을 것입니다.
쉽지만 역사상 잃어 버렸습니다. 이 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
set
옵션을 설정하는 방법은 원래 유닉스 쉘에는 없었으며, 70 년대 후반 Bourne 쉘에 의해 소개되었습니다. set -o name
그 자체는 나중에 Korn 쉘에 의해 추가되었지만 POSIX에서는 옵션이지만 선택 사항이지만 Solaris 10 과 같은 Bourne 쉘의 "현대" 버전 에서는 여전히 지원되지 않습니다 /bin/sh
.
"세트"옵션은 서브 쉘에 의해 상속되는 것으로 보이지만 쇼핑객은 그렇지 않습니다.
set
subshells.Both 상속되지 set
및 shopt
옵션 서브 쉘 상속되지 않는다.
set
및 의 상속 특성을 설명하는 문서를 가리킬 수 있습니까 shopt
?
set -o
와 shopt
옵션은 서브 쉘 (상속 (...)
, $(...)
파이프 라인 구성 요소). 그들은 다른 상속 여부 bash
호출 여부에 따라 SHELLOPTS
또는 BASHOPTS
환경 여부에 있습니다.
set
bourne 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
$
help set
하고help shopt
심지어 저자들이 같은 일을 생각 있는지 확인합니다.