Set and Shopt-なぜ2つなのか?


72

setそしてshopt、さまざまなオプションを制御両方のシェル組み込みコマンドです。どのコマンドによってどのオプションが設定されるか、どのオプションが設定/設定解除(set -o/+oshopt -s/-u)するかをよく忘れます。どうやら同じことをしているように見える(そしてそうするために異なる引数を持っている)2つの異なるコマンドがあるのはなぜですか?どのオプションがどのコマンドに対応するかを覚える簡単な方法/ニーモニックはありますか?


6
2行目を見て試してみてくださいhelp sethelp shoptさえその作者は、彼らが同じことを行うと考えていることを確認します。
l0b0

2
「シェル属性の値を変更する」vs「各シェルオプションの設定を変更する」。
ケビン

2
Bash 4.1.5(1)-releaseでは、「シェルオプションと位置パラメーターの値を設定または設定解除する」と書かれています。および「シェルオプションの設定と設定解除」。
l0b0

マンページを書くことは、あなたが知らないことを理解させ、あなたが書き込もうとしていることに関して間違った方法で物事を定式化しようとします。
sjas

回答:


40

私の知る限り、set -oオプションは他のBourneスタイルのシェル(主にksh)から継承されたものであり、shoptオプションはbashに固有のものです。私が知っているロジックはありません。


1
示すドキュメントはすべてshopt継承されますか?
フェリペアルバレス

8
まあ、そこにあるset -oようなオプションposix/ physical/ interactive-commentsではないksh、とshoptを含む他のシェルであるもののkshようないくつかのためにlogin_shell/でnullglob。あなたが言うように、論理はありません。当初はおそらくアイデアでした(SHELLOPTSが標準的なものであり、BASHOPTSがbash固有のものです)が、それは途中で失われ、今ではうっとうしくなり、UIデザインの大失敗に終わります。
ステファンシャゼラス

22

違いは、bashが使用する変更された環境変数にあります。setコマンドで設定すると、になり$SHELLOPTSます。shoptコマンドで設定すると、になり$BASHOPTSます。


9
うん!それはさらに紛らわしいです。私の脳は関連させたいshopt$とSH ELL OPTではなく$ BAよりもS SHOPT S.
ブルーノBronosky


8

簡単ですが、歴史の中で失われました。この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

2
setオプションを設定する方法は元のUnixシェルにはなかったため、70年代後半にBourneシェルによって導入されました。set -o name自身まだでサポートされていない、POSIXで指定されたものの、オプション、Kornシェルで後で追加された「現代」のようなBourneシェルのバージョン/bin/shのSolaris 10の
ステファンChazelas

5

「Linux Shell Scripting with Bash」という本から、p 63:

歴史的に、このsetコマンドはオプションのオンとオフを切り替えるために使用されていました。オプションの数が増えるにつれて、setオプションは1文字のコードで表されるため、使用が難しくなりました。その結果、Bashはshoptshell option)コマンドを提供して、文字ではなく名前でオプションをオンまたはオフにします。特定のオプションは文字でのみ設定できます。その他は、shoptコマンドの下でのみ使用可能です。これは、特定のオプションを見つけて設定することを混乱させるタスクにします。


3

「設定」オプションはサブシェルに継承され、ショップは継承されないようです。


ナイスキャッチ。これは意図的な選択なのか、それとも副作用なのか疑問です。
ケビン

2
@ user29778は、少なくとも下bashの4.1.5(1)で設定したオプションは、setsubshel​​ls.Bothによって継承されていないsetshoptオプションは、サブシェルには継承されません。
マーティン

あなたは、両方の継承の特性を説明文書を指し示すことができるsetとはshopt
フェリペアルバレス

9
両方set -oshoptオプションはサブシェル(継承され(...)$(...)パイプライン構成要素)。それらが他のbash呼び出しによって継承されるかどうSHELLOPTSBASHOPTSは、環境にあるかどうかによって異なります。
ステファンシャゼル

0

setbourneシェル(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.