Quelle est la différence entre déclarer et composer

22

Quelqu'un peut-il expliquer la différence entre déclarer et composer avec des exemples réels.

Rahul Patil
la source

Réponses:

27

Dans bash, typesetet declaresont exactement les mêmes. La seule différence est qu'elle typesetest considérée comme obsolète.

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

    Obsolete.  See `help declare'.

La page de manuel les répertorie même du même souffle:

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

typesetest portable pour certains autres shells, par exemple ksh93,. Si vous visez la portabilité cross-shell, utilisez typeset(et assurez-vous que la façon dont vous l'appelez est portable). Si vous ne vous souciez pas d'une telle portabilité, utilisez declare.

Chris Down
la source
pouvez-vous s'il vous plaît fournir un exemple où et pourquoi cette utilisation dans le script bash
Rahul Patil
1
... comme je l'ai dit, ils sont exactement les mêmes. Je ne comprends pas comment je peux les différencier s'ils le sont.
Chris Down
2
Bon. Notez que "obsolète" apparaît simplement dans help typeset, pas dans man typeset.
fedorqui
2
@ChrisDown, vous ne sauriez pas pourquoi, exactement, typesetest considéré comme obsolète?
Alexej Magura
3

Je connais un cas où il declareest utile d'éviter le mal eval: indirection variable :

$ var=foo
$ x=var
$ declare "$x=another_value"
$ echo $var
another_value
Gilles Quenot
la source
C'est un bon commentaire, mais comment cela répond-il à la question qui porte sur typesetet declare?
jw013
C'est déjà bien répondu par Chris Down, ma réponse est juste un cas où c'est utile
Gilles Quenot
Peut-être que je n'étais pas clair. Les commentaires doivent être des commentaires et les réponses doivent être des réponses. Ceci est un commentaire, pas une réponse.
jw013
3
Mon extrait ne s'effacerait pas dans un commentaire
Gilles Quenot
mais vous pouvez toujours assigner des variables avec typeset ... remplacez simplement declare par typeset et vous obtenez toujours le même résultat.
pcarvalho