Was ist der Unterschied zwischen declare und typeset?

22

Kann jemand den Unterschied zwischen Deklarieren und Setzen anhand von Beispielen aus der Praxis erklären?

Rahul Patil
quelle

Antworten:

27

In bash, typesetund declaresind genau die gleichen. Der einzige Unterschied ist, dass dies typesetals veraltet gilt.

typeset: typeset [-aAfFgilrtux] [-p] name[=value] ...
    Set variable values and attributes.

    Obsolete.  See `help declare'.

Die Manpage listet sie sogar im selben Atemzug auf:

declare [-aAfFgilrtux] [-p] [name[=value] ...]
typeset [-aAfFgilrtux] [-p] [name[=value] ...]
    Declare variables and/or give them attributes.

typesetist zum Beispiel auf einige andere Shells übertragbar ksh93. Wenn Sie Cross-Shell-Portabilität anstreben, verwenden Sie typeset(und stellen Sie sicher, dass die Art und Weise, wie Sie sie aufrufen, portabel ist). Wenn Sie sich nicht für eine solche Portabilität interessieren, verwenden Sie declare.

Chris Down
quelle
Kannst du bitte ein Beispiel dafür geben, wo und warum dies im Bash-Skript verwendet wird
Rahul Patil,
1
... wie gesagt, sie sind genau gleich. Ich verstehe nicht, wie ich sie unterscheiden kann, wenn sie so sind.
Chris Down
2
Gut Beachten Sie, dass "veraltet" nur in angezeigt wird help typeset, nicht in man typeset.
Fedorqui
2
@ ChrisDown, du würdest nicht zufällig wissen, warum genau dies typesetals veraltet gilt?
Alexej Magura
3

Ich kenne einen Fall, in dem declarees nützlich ist, das Böse zu vermeiden eval: variable Indirektion :

$ var=foo
$ x=var
$ declare "$x=another_value"
$ echo $var
another_value
Gilles Quenot
quelle
Das ist ein netter Kommentar, aber wie beantwortet das die Frage, um die es geht typesetund declare?
JW013
Dies wird bereits von Chris Down gut beantwortet, meine Antwort ist nur ein Fall, in dem es nützlich ist
Gilles Quenot
Vielleicht war ich nicht klar. Kommentare sollten Kommentare sein und Antworten sollten Antworten sein. Dies ist ein Kommentar, keine Antwort.
jw013
3
Mein Ausschnitt wurde in einem Kommentar nicht
gelöscht
Sie können jedoch weiterhin Variablen mit Typensatz zuweisen. Ersetzen Sie "declare" durch "typeset", und Sie erhalten weiterhin das gleiche Ergebnis.
pcarvalho