セットとショップ-なぜ2つ?

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

コメント

  • help sethelp shoptを使用して、作成者でさえ同じことをしていると考えていることを確認します。
  • "シェル属性の値を変更する"と"各シェルオプションの設定を変更する"。
  • Bash 4.1.5(1)-リリースでは、"シェルオプションと位置パラメータの値を設定または設定解除します。"および"シェルオプションを設定および設定解除します。それぞれ"。
  • 書き込みマンページを使用すると、自分が知らないことを認識し、書き込もうとしていることについて間違った方法で物事を定式化しようとすることができます。

回答

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

コメント

  • shoptを示すドキュメントはすべて継承されますか?
  • そうですね、set -oオプションにはposix / physicalkshにないdiv> / interactive-comments、およびその他にあるshopt login_shell / nullglobなどのkshを含むシェル。おっしゃるように'ロジックはありません。おそらく最初はアイデアでしたが(SHELLOPTSが標準のもので、BASHOPTSがbash固有のものになる)、途中で失われ、現在は煩わしく、UIデザインの大失敗に終わってしまいます。

回答

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

コメント

  • うーん!それはさらに混乱します。私の脳は、shoptを$ BA SHOPT Sではなく$ SH ELL OPT Sに関連付けたいと考えています。

回答

おそらく@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オプションはどちらもサブシェルに継承されません。
  • setshoptの両方の継承特性を説明しているドキュメントを指摘できますか?
  • 両方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 $ 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です