set
とshopt
はどちらも、さまざまな制御を行うシェルビルトインです。オプション。どのオプションがどのコマンドによって設定され、どのオプションが設定/設定解除されるかを忘れがちです(set -o/+o
、shopt -s/-u
)。同じことをしているように見える(そしてそうするための引数が異なる)2つの異なるコマンドがあるのはなぜですか?どのオプションがどのコマンドに対応するかを覚える簡単な方法/ニーモニックはありますか?
コメント
回答
私の知る限り、オプションは、他のBourneスタイルのシェル(主にksh)から継承されたものであり、shopt
オプションはbashに固有のオプションです。私が知っているロジックはありません。
コメント
-
shopt
を示すドキュメントはすべて継承されますか? - そうですね、
set -o
オプションにはposix
/physical
ksh
にないdiv> /interactive-comments
、およびその他にあるshopt
login_shell
/nullglob
などのksh
を含むシェル。おっしゃるように'ロジックはありません。おそらく最初はアイデアでしたが(SHELLOPTSが標準のもので、BASHOPTSがbash固有のものになる)、途中で失われ、現在は煩わしく、UIデザインの大失敗に終わってしまいます。
回答
違いは変更された環境変数にありますbashで使用されます。set
コマンドで設定すると、。 shopt
コマンドで設定すると、$BASHOPTS
になります。
コメント
- うーん!それはさらに混乱します。私の脳は、
shopt
を$ BA SHOPT Sではなく$ SH ELL OPT Sに関連付けたいと考えています。
回答
-
set
POSIX 7:設定-オプションと位置パラメータを設定または設定解除します| pubs.opengroup.org -
shopt
は次のとおりではありません:シェル&ユーティリティ:詳細な目次| pubs.opengroup.org
おそらく@Gillesが言及した歴史にリンクされています。
回答
簡単ですが、歴史の中で失われています。 set
コマンドは、元のunixシェルのコマンドライン環境を変更するために最初に使用されました/bin/sh
。その後、さまざまなUnixバージョンが進化し、新しいシェルフレーバーが追加されると、シェルスクリプトの互換性を維持するために、より多くの(環境)ものを変更できる必要があることに人々は気付きました。その時、Bashは非常に人気があり、追加の sh ell opt イオンが必要で、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で指定されていますがオプションであり、 "モダンividではまだサポートされていません。 Solaris10の/bin/sh
のようなBourneシェルの= “583b4a846f”>
バージョン。
回答
「LinuxShellScripting with Bash」、63ページから:
これまで、
set
コマンドを使用してオプションのオンとオフを切り替えていました。オプションの数が増えると、オプションは1文字のコードで表されるため、set
の使用が難しくなりました。その結果、Bashはshopt
( shell option )コマンドを提供して、文字ではなく名前でオプションのオンとオフを切り替えます。特定のオプションは文字でのみ設定できます。その他は、shopt
コマンドでのみ使用できます。これにより、特定のオプションを見つけて設定することが混乱する作業になります。
回答
「設定」オプションはサブシェルに継承されているようです買い物客はそうではありません。
コメント
- いいキャッチです。これは意図的な選択なのか副作用なのか疑問に思います。
- @ user29778少なくとも bash 4.1.5(1)では、はサブシェルに継承されません。
set
オプションとshopt
オプションはどちらもサブシェルに継承されません。 -
set
とshopt
の両方の継承特性を説明しているドキュメントを指摘できますか? - 両方
set -o
およびshopt
オプションは、サブシェル((...)
、、パイプラインコンポーネント)。それらが他のbash
呼び出しによって継承されるかどうかは、SHELLOPTS
またはBASHOPTS
が環境かどうか。
回答
set
はBourneシェル(sh)であり、POSIX標準の一部ですが、shopt
はそうではなく、Bourneシェル(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
を使用して、作成者でさえ同じことをしていると考えていることを確認します。