set
そしてshopt
、さまざまなオプションを制御両方のシェル組み込みコマンドです。どのコマンドによってどのオプションが設定されるか、どのオプションが設定/設定解除(set -o/+o
、shopt -s/-u
)するかをよく忘れます。どうやら同じことをしているように見える(そしてそうするために異なる引数を持っている)2つの異なるコマンドがあるのはなぜですか?どのオプションがどのコマンドに対応するかを覚える簡単な方法/ニーモニックはありますか?
set
そしてshopt
、さまざまなオプションを制御両方のシェル組み込みコマンドです。どのコマンドによってどのオプションが設定されるか、どのオプションが設定/設定解除(set -o/+o
、shopt -s/-u
)するかをよく忘れます。どうやら同じことをしているように見える(そしてそうするために異なる引数を持っている)2つの異なるコマンドがあるのはなぜですか?どのオプションがどのコマンドに対応するかを覚える簡単な方法/ニーモニックはありますか?
回答:
私の知る限り、set -o
オプションは他のBourneスタイルのシェル(主にksh)から継承されたものであり、shopt
オプションはbashに固有のものです。私が知っているロジックはありません。
shopt
継承されますか?
set -o
ようなオプションposix
/ physical
/ interactive-comments
ではないksh
、とshopt
を含む他のシェルであるもののksh
ようないくつかのためにlogin_shell
/でnullglob
。あなたが言うように、論理はありません。当初はおそらくアイデアでした(SHELLOPTSが標準的なものであり、BASHOPTSがbash固有のものです)が、それは途中で失われ、今ではうっとうしくなり、UIデザインの大失敗に終わります。
違いは、bashが使用する変更された環境変数にあります。set
コマンドで設定すると、になり$SHELLOPTS
ます。shopt
コマンドで設定すると、になり$BASHOPTS
ます。
shopt
$とSH ELL OPTではなく$ BAよりもS SHOPT S.
set
POSIX 7:set-オプションおよび定位置パラメーターの設定または設定解除| pubs.opengroup.org
shopt
ではありません:Shell&Utilities:Detailed Toc | pubs.opengroup.org
おそらく、@ Gillesによって言及された歴史にリンクしています。
簡単ですが、歴史の中で失われました。このset
コマンドは元々、元のUNIXシェルのコマンドライン環境を変更するために使用されていました/bin/sh
。その後、さまざまなUnixバージョンが進化し、新しいシェルフレーバーが追加されると、人々はシェルスクリプトの互換性を維持するために、より多くの(環境)を変更できる必要があることに気付きました。当時バッシュは非常に人気だと、追加の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
オプションを設定する方法は元のUnixシェルにはなかったため、70年代後半にBourneシェルによって導入されました。set -o name
自身まだでサポートされていない、POSIXで指定されたものの、オプション、Kornシェルで後で追加された「現代」のようなBourneシェルのバージョン/bin/sh
のSolaris 10の
「Linux Shell Scripting with Bash」という本から、p 63:
歴史的に、この
set
コマンドはオプションのオンとオフを切り替えるために使用されていました。オプションの数が増えるにつれて、set
オプションは1文字のコードで表されるため、使用が難しくなりました。その結果、Bashはshopt
(shell option)コマンドを提供して、文字ではなく名前でオプションをオンまたはオフにします。特定のオプションは文字でのみ設定できます。その他は、shopt
コマンドの下でのみ使用可能です。これは、特定のオプションを見つけて設定することを混乱させるタスクにします。
「設定」オプションはサブシェルに継承され、ショップは継承されないようです。
set
subshells.Bothによって継承されていないset
とshopt
オプションは、サブシェルには継承されません。
set
とはshopt
?
set -o
とshopt
オプションはサブシェル(継承され(...)
、$(...)
パイプライン構成要素)。それらが他のbash
呼び出しによって継承されるかどうSHELLOPTS
かBASHOPTS
は、環境にあるかどうかによって異なります。
set
bourneシェル(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
さえその作者は、彼らが同じことを行うと考えていることを確認します。