set
und shopt
sind beide Shell-Builtins, die verschiedene Optionen steuern. Ich vergesse oft, welche Optionen von welchem Befehl gesetzt werden und welche Option setzt / deaktiviert ( set -o/+o
, shopt -s/-u
). Warum gibt es zwei verschiedene Befehle, die anscheinend dasselbe tun (und unterschiedliche Argumente dafür haben)? Gibt es eine einfache Möglichkeit, sich zu merken, welche Optionen zu welchem Befehl gehören?
72
help set
und stellen Siehelp shopt
sicher, dass auch die Autoren der Ansicht sind, dass sie dasselbe tun.Antworten:
Soweit ich weiß, sind die
set -o
Optionen diejenigen, die von anderen Bourne-artigen Shells (meistens ksh) geerbt wurden, und dieshopt
Optionen sind diejenigen, die spezifisch für bash sind. Ich kenne keine Logik.quelle
shopt
wird geerbt?set -o
Optionen wieposix
/physical
/interactive-comments
, die nicht inksh
, undshopt
diejenigen , die in anderen Shells sind darunterksh
für einige wielogin_shell
/nullglob
. Wie Sie sagen, es gibt keine Logik. Es war wahrscheinlich die Idee am Anfang (dass SHELLOPTS die Standardidee sein würde und BASHOPTS die bashspezifischen), aber das ging auf dem Weg verloren und jetzt ist es nur noch ärgerlich und ein Fiasko beim Design der Benutzeroberfläche.Der Unterschied liegt in der geänderten Umgebungsvariablen, die von bash verwendet wird. Die Einstellung mit dem
set
Befehl führt zu$SHELLOPTS
. Die Einstellung mit demshopt
Befehl führt zu$BASHOPTS
.quelle
shopt
mit $ SH ELL OPT S als mit $ BA SHOPT S in Verbindung treten .set
ist POSIX 7: set - set oder unset Optionen und Positionsparameter | pubs.opengroup.orgshopt
ist nicht: Shell & Utilities: Detailed Toc | pubs.opengroup.orgVermutlich im Zusammenhang mit der von @Gilles erwähnten Geschichte.
quelle
Einfach, aber verloren in der Geschichte. Der
set
Befehl wurde ursprünglich verwendet, um die Befehlszeilenumgebung der ursprünglichen Unix-Shells zu ändern/bin/sh
. Als sich dann verschiedene Unix-Versionen entwickelten und neue Shell-Varianten hinzukamen, wurde den Leuten klar, dass sie in der Lage sein mussten, mehr (Umgebungs-) Dinge zu ändern, um die Kompatibilität mit Shell-Skripten zu gewährleisten. Damals bekam Bash sehr beliebt und die zusätzlichen sh ell opt - Ionen benötigt wurde, die Einführungshopt
.Sie können diese Kompatibilitätsversuche tatsächlich im
shopt
Befehl sehen.Aber nicht im
set
Befehl.quelle
set
Da Optionen nicht in den ursprünglichen Unix-Shells festgelegt werden konnten, wurde sie 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 "modernen" Versionen der Bourne-Shell wie der/bin/sh
von Solaris 10 noch nicht unterstützt wird .Aus dem Buch "Linux Shell Scripting mit Bash", S. 63:
quelle
Es sieht so aus, als ob "Set" -Optionen von Subshells geerbt werden und Shopts nicht.
quelle
set
gesetzten Optionen nicht von Subshells geerbt. Beideset
undshopt
Optionen werden nicht von Subshells geerbt.set
und beschreibtshopt
?set -o
undshopt
Optionen werden von Subshells vererbt ((...)
,$(...)
, Pipeline - Komponenten). Ob sie von anderen übernommen werdenbash
Anrufungen hängt davon ab , obSHELLOPTS
oderBASHOPTS
sind in der Umwelt oder nicht.set
stammt aus der bourne-Shell (sh) und ist Teil des POSIX-Standards,shopt
ist jedoch nicht und bourne-again-Shell (bash) -spezifisch:quelle