Set and Shopt – Warum zwei?

set und shopt sind beide Shell-Buildins, die verschiedene steuern Optionen. Ich vergesse oft, welche Optionen mit welchem Befehl festgelegt werden und welche Optionen gesetzt / deaktiviert werden (set -o/+o, shopt -s/-u). Warum gibt es zwei verschiedene Befehle, die scheinbar dasselbe tun (und unterschiedliche Argumente dafür haben)? Gibt es eine einfache Möglichkeit / Mnemonik, sich zu merken, welche Optionen zu welchem Befehl gehören?

Kommentare

  • Schauen Sie sich die zweite Zeile von help set und help shopt, um zu überprüfen, ob selbst ihre Autoren glauben, dass sie dasselbe tun.
  • " Ändern Sie den Wert der Shell-Attribute " vs " Ändern Sie die Einstellung jeder Shell-Option ".
  • In Bash 4.1.5 (1) -release heißt es " Werte von Shell-Optionen und Positionsparametern setzen oder deaktivieren. " und " Shell-Optionen festlegen und deaktivieren. ".
  • Schreiben Auf manpages wird Ihnen klar, was Sie nicht wissen, und Sie versuchen, Dinge so zu formulieren, dass Sie nicht falsch darüber sind, worüber Sie schreiben möchten.

Antwort

Soweit ich weiß, ist die -Optionen sind diejenigen, die von anderen Bourne-Shells (meistens ksh) geerbt wurden, und die shopt -Optionen sind diejenigen, die für Bash spezifisch sind. Es gibt keine mir bekannte Logik.

Kommentare

  • Jede Dokumentation, die shopt zeigt, ist geerbt?
  • Nun, es gibt set -o Optionen wie posix / physical / interactive-comments, die sich nicht in ksh befinden, und shopt, die sich in anderen befinden Shells einschließlich ksh für einige wie login_shell / nullglob. Wie Sie sagen, gibt es ' ist keine Logik. Es war wahrscheinlich die Idee am Anfang (dass SHELLOPTS die Standard- und BASHOPTS die Bash-spezifischen sein würden), aber das ging auf dem Weg verloren, und jetzt ist es Am Ende ist es nur ärgerlich und ein UI-Design-Fiasko.

Antwort

Der Unterschied liegt in der geänderten Umgebungsvariablen Wird von bash verwendet. Die Einstellung mit dem Befehl set führt zu . Das Festlegen mit dem Befehl shopt führt zu $BASHOPTS.

Kommentare

  • Ugh! Das ist noch verwirrender. Mein Gehirn möchte shopt mit $ SH ELL OPT S anstatt mit $ BA SHOPT S verknüpfen .

Antwort

Vermutlich in Verbindung mit der von @Gilles erwähnten Geschichte.

Antwort

Einfach, aber in der Geschichte verloren. Der Befehl set wurde ursprünglich verwendet, um die Befehlszeilenumgebung der ursprünglichen Unix-Shells . Als sich dann verschiedene Unix-Versionen entwickelten und neue Shell-Varianten hinzugefügt wurden, erkannten die Leute, dass sie in der Lage sein mussten, mehr (Umgebungs-) Dinge zu ändern, um die Kompatibilität von Shell-Skripten aufrechtzuerhalten. Zu dieser Zeit wurde Bash sehr beliebt und das zusätzliche sh ell opt Ionen wurden benötigt, wodurch shopt eingeführt wurde.

Sie können diese compatible ibility-Versuche im Befehl 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 

Aber nicht im Befehl 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 

Kommentare

  • set als Möglichkeit zum Festlegen von Optionen war nicht ' t in den ursprünglichen Unix-Shells wurde es Ende der 70er Jahre von der Bourne-Shell eingeführt. set -o name selbst wurde später von der Korn-Shell hinzugefügt, die in POSIX angegeben, aber optional ist und von " modern " Versionen der Bourne-Shell wie die /bin/sh von Solaris 10.

Antwort

Aus dem Buch „Linux Shell Scripting with Bash“, S. 63:

In der Vergangenheit wurde der Befehl set zum Ein- und Ausschalten von Optionen verwendet. Mit zunehmender Anzahl von Optionen wurde die Verwendung von set schwieriger, da Optionen durch einzelne Buchstabencodes dargestellt werden. Infolgedessen stellt Bash den Befehl shopt ( Shell-Option ) bereit, um Optionen nach Namen anstelle eines Buchstabens ein- und auszuschalten. Sie können bestimmte Optionen nur per Buchstabe festlegen. Andere sind nur unter dem Befehl shopt verfügbar. Dies macht das Finden und Einstellen einer bestimmten Option zu einer verwirrenden Aufgabe.

Antwort

Es sieht so aus, als würden „set“ -Optionen von Subshells geerbt und Geschäfte nicht.

Kommentare

  • Netter Fang. Ich frage mich, ob dies eine absichtliche Wahl oder ein Nebeneffekt ist.
  • @ user29778 Zumindest unter bash 4.1.5 (1) die mit werden nicht von Subshells geerbt. Die Optionen set und shopt werden nicht von Subshells geerbt.
  • Können Sie auf die Dokumentation verweisen, in der die Vererbungseigenschaften von set und shopt beschrieben werden?
  • Both set -o und shopt werden von Unterschalen geerbt ((...), , Pipeline-Komponenten). Ob sie von anderen bash -Aufrufen geerbt werden, hängt davon ab, ob SHELLOPTS oder BASHOPTS in der Umgebung oder nicht.

Antwort

set stammt aus dem bourne shell (sh) und ist Teil des POSIX-Standards, shopt ist jedoch nicht und ist bourne-again-Shell (bash) spezifisch:

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 $ 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.