Was macht der Befehl set ohne Argumente?

22

Was macht ein setBefehl ohne Argumente?

Wie ich sehen kann, druckt es meine Umgebungsvariablen genau wie ein envBefehl aus, jedoch in alphabetischer Reihenfolge. Außerdem werden verschiedene Informationen (Variablen? Funktionen?) Ausgegeben:

__git_printf_supports_v=yes
__grub_script_check_program=grub-script-check
...
quote () 
{ 
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}
quote_readline () 
{ 
    local quoted;
    _quote_readline_by_ref "$1" ret;
    printf %s "$ret"
}

Was ist es und wo kommt es her?

Ich kann keine Informationen zu setBefehlen ohne Argumente finden. Eigentlich habe ich in meiner Linux-Distribution überhaupt keine manSeite für set.

Aleksandr Kovalev
quelle
1
"Dieses eingebaute System ist so kompliziert, dass es einen eigenen Abschnitt verdient." Siehe die Dokumentation
Galath

Antworten:

17

set ist eine integrierte Shell, die alle Shell-Variablen anzeigt, nicht nur die Umgebungsvariablen, sondern auch die Shell-Funktionen, die Sie am Ende der Liste sehen.

Variablen werden mit einer Syntax angezeigt, mit der sie festgelegt werden können, wenn die Zeilen ausgeführt oder bezogen werden.

Von der bash Manualseite :

Wenn keine Optionen oder Argumente angegeben werden, zeigt set die Namen und Werte aller Shell-Variablen und -Funktionen sortiert nach dem aktuellen Gebietsschema in einem Format an, das als Eingabe zum Festlegen oder Zurücksetzen der aktuell festgelegten Variablen verwendet werden kann.

Bei verschiedenen Schalen ist das Verhalten nicht unbedingt dasselbe. Zeigt beispielsweise ksh setkeine Shell-Funktionen an.

jlliagre
quelle
3
Das liegt daran, dass kshdie Funktionsdefinition nicht in der Shell-Variablen gespeichert wird.
15.
2
@cuonglm Eine kluge Designentscheidung von dgk! ;-)
jlliagre
7

Weil setausgegeben wurde und which setnichts zurückgibt, von dem Sie wissen, dass es Teil der von Ihnen verwendeten Shell ist, wahrscheinlich bash.

man bash erwähnt es oft, aber es ist einfacher in der Online-Dokumentation zu verlinken .

Dieser Einbau ist so kompliziert, dass er einen eigenen Abschnitt verdient. Mit set können Sie die Werte von Shell-Optionen ändern und die Positionsparameter festlegen oder die Namen und Werte von Shell-Variablen anzeigen.

set hat die Rufspezifikation von:

set [--abefhkmnptuvxBCEHPT] [-o option-name] [argument …]
set [+abefhkmnptuvxBCEHPT] [+o option-name] [argument …]

Wenn Sie es also auf der Kommandozeile in man finden möchten, können Sie mit suchen

/set.*abef
user1133275
quelle
which sethängt von deiner Schale ab. Zumindest zshwerde ich es für dich melden. Sie können auch lesen diese für weitere Details.
16.
Es ist unwahrscheinlich, dass es sich bei der Frage um etwas anderes als Bash handelt, da es eine große Marktdominanz hat und jeder, der die nicht standardmäßige Shell verwendet, diese Frage nicht stellen müsste.
user1133275
6

setist eine eingebaute Shell , die für festgelegte und nicht festgelegte Shell-Optionen und Positionsparameter verwendet wird.

Ohne Argumente setwerden alle Shell-Variablen (sowohl Umgebungsvariablen als auch Variablen in der aktuellen Sitzung) in der aktuellen Ländereinstellung sortiert ausgegeben .

Sie können auch die Bash-Dokumentation lesen .


Es gibt ein paar Einschränkungen.

set "$var"wird varWert zuweisen $1. Wenn Sie $varmit -oder beginnen +, wurde der $varInhalt als Folge von Shell-Optionen behandelt. Wenn $varungültige Optionen enthalten sind, wird der Fehler von den meisten POSIX-Shells gedruckt. yashund zshin sh, kshEmulation gedruckt werden nicht nur die Fehler, sondern auch gültige Optionen einstellen. Wenn Sie yashdie Einstellung der Optionen für die erste ungültige Option beenden, zshwerden alle zugewiesen. In yash:

var=-fxd; set "$var"

fund xwird in präsentieren $-, während:

var=fdx; set "$var"

nur fanwesend in $-. In beiden Fällen fund xwird $-mit zshin shund kshEmulation präsentieren.

Um Sie vor dieser Situation zu schützen, können Sie --als erstes Argument angeben, dass der Positionsparameter gesetzt werden soll, auch wenn er mit -oder beginnt +:

var=-fdx; set -- "$var"

wird vergeben $varan $1, unabhängig von dessen Inhalt.

set -- Ohne weitere Argumente werden alle Positionsparameter zurückgesetzt.

Wenn das erste Argument lautet -, ist das Verhalten nicht angegeben. Alle bekannten POSIX-Shells deaktivieren xund vaktivieren (außer posh) und weisen -den Positionsparametern anschließend Folgendes zu:

set -xv - -f

wird zuweisen -fzu $1. set -hat auch die Positionsparameter nicht aufgehoben. Schily osh benimmt sich auch so. Erbstück sh nicht eingestellt vund xOptionen.

Die einzige POSIX-Shell-Ausnahme ist yash, die -als ersten Positionsparameter behandelt :

$ yash -c 'set -xv - -f; printf "%s\n" "$@"; printf "%s\n" "$-"'
+ printf %s\n - -f
-
-f
+ printf %s\n cvx
cvx

Schily tut gar nichts, wenn -in Argumenten vorhanden:

$ schily-sh -c 'set -v - -f; printf "%s\n" "$@"; printf "%s\n" "$-"'
<blank line>
s

$ schily-sh -c 'set -v -- -f; printf "%s\n" "$@"; printf "%s\n" "$-"'
-f
vs
cuonglm
quelle
Ich verstehe nie, warum sich Menschen mit irgendwo anders verbinden als mit dem Ersten. Vielleicht möchten Sie die Unterschiede zwischen set -- $unset,, set - $unsetund set $unsetund set "$unset"und erwähnen. Normalerweise sind es diese Unstimmigkeiten, die Menschen überhaupt erst in solche Schwierigkeiten bringen.
mikeserv
@mikeserv: Nun, ich habe weitere Details hinzugefügt, aber ich habe nicht verstanden, was du meinst, wenn es benutzt wird $unset.
16.
@cuonglm Der Befehl verhält sich set $unsetgenauso wie setbei einer nicht gesetzten Variablen. Aber set "$unset" es macht nichts, wenn unsetes sich tatsächlich um eine nicht gesetzte Variable handelt. A set - $unsetentfernt die -vund -xset-Optionen (in Bash).
@ BinaryZebra: Ah, natürlich ist es für mich besser, es zu benutzen unset_var. Und beachte auch, dass set "$unset"eigentlich $1auf leer gesetzt ist. Hier geht es um Shell-Erweiterung, setalso erwähne ich es nicht.
16.
1
@mikeserv: Das Verhalten von poshund yashist unterschiedlich, wenn es -erscheint. Sie können meine aktualisierten lesen (und fühlen sich frei, es zu verbessern).
16.
2

Wenn Sie in einer Bash-Shell arbeiten, geben Sie Folgendes ein help set.

Lesen Sie am Ende der gedruckten Hilfe Folgendes:

Wenn keine ARGs angegeben sind, werden alle Shell-Variablen gedruckt.

Ein no-Argument gibt also setalle Variablen aus, die der Shell bekannt sind.


quelle
Ich frage mich, ob set -x; setes hilfreich wäre
ILMostro_7