Que fait la commande set sans arguments?

22

Que fait la setcommande sans arguments?

Comme je peux le voir, il imprime mes variables d'environnement comme une envcommande mais dans l'ordre alphabétique. Et en plus il imprime différentes informations (variables? Fonctions?) Comme:

__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"
}

Qu'est-ce que c'est et d'où ça vient?

Je ne trouve pas d'informations sur la setcommande sans arguments. En fait, je n'ai pas du tout de manpage pour setma distribution Linux.

Aleksandr Kovalev
la source
1
"Cette fonction intégrée est si compliquée qu'elle mérite sa propre section." Voir les documents
galath

Réponses:

17

set est un shell intégré qui affiche toutes les variables du shell, non seulement celles de l'environnement, mais aussi les fonctions du shell, ce que vous voyez à la fin de la liste.

Les variables sont affichées avec une syntaxe qui permet de les définir lorsque les lignes sont exécutées ou sourcées.

Depuis bash la page de manuel :

Si aucune option ou argument n'est fourni, set affiche les noms et les valeurs de toutes les variables et fonctions du shell, triés en fonction des paramètres régionaux actuels, dans un format qui peut être réutilisé comme entrée pour définir ou réinitialiser les variables actuellement définies.

Sur différents obus, le comportement n'est pas nécessairement le même; par exemple, ksh setn'affiche pas les fonctions shell.

jlliagre
la source
3
En effet ksh, ne stockez pas la définition de fonction dans la variable shell.
cuonglm
2
@cuonglm Une sage décision de conception prise par dgk! ;-)
jlliagre
7

Parce qu'il seta une sortie et which setne renvoie rien, vous savez qu'il fait partie du shell que vous utilisez, probablement bash.

man bash le mentionne plusieurs fois, mais il est plus facile d'y accéder dans la documentation en ligne .

Cette fonction intégrée est si compliquée qu'elle mérite sa propre section. set vous permet de modifier les valeurs des options du shell et de définir les paramètres de position, ou d'afficher les noms et les valeurs des variables du shell.

set a la spécification d'appel de:

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

donc si vous voulez le trouver chez l'homme sur la ligne de commande, vous pouvez rechercher avec

/set.*abef
user1133275
la source
which setdépend de votre coquille. Au moins zshle signalera pour vous. Vous pouvez également lire ceci pour plus de détails.
cuonglm
Il est peu probable que la question porte sur autre chose que bash car il a une forte domination du marché, et toute personne utilisant le shell non par défaut n'aurait pas besoin de poser cette question.
user1133275
6

setest un shell intégré , utilisé pour définir et désactiver les options de shell et les paramètres de position.

Sans arguments, setaffichera toutes les variables shell (à la fois les variables d'environnement et les variables de la session en cours) triées dans les paramètres régionaux actuels .

Vous pouvez également lire la documentation bash .


Il y a quelques mises en garde.

set "$var"attribuera une varvaleur à $1. Si vous $varcommencez par -ou +, le $varcontenu a été traité comme des séquences d'options de shell. Si elles $varcontiennent des options non valides, la plupart des shells POSIX imprimeront l'erreur. yashet zshdans sh, l' kshémulation imprime non seulement l'erreur, mais définit également des options valides. Lorsque vous yasharrêtez de définir des options sur la première option non valide, vous zshles affecterez toutes. Dans yash:

var=-fxd; set "$var"

fet xprésentera dans $-, tout en:

var=fdx; set "$var"

uniquement fprésent en $-. Dans les deux cas, fet xprésentera $-avec zshin shet kshémulation.

Pour vous protéger de cette situation, vous pouvez passer --comme premier argument pour définir le paramètre positionnel même s'il commence par -ou +:

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

attribuera $varà $1, quel que soit son contenu.

set -- sans aucun autre argument annulera tous les paramètres de position.

Si le premier argument est -, le comportement n'est pas spécifié. Tous les shells POSIX connus seront désactivés xet les voptions (sauf posh), et assigneront quoi que ce soit après -aux paramètres de position:

set -xv - -f

assignera -fà $1. set -n'a pas non plus effacé les paramètres de position. Schily osh se comporte aussi comme ça. Heirloom sh ne désélectionne pas vet les xoptions.

La seule exception du shell POSIX est yash, qui traite -comme le premier paramètre positionnel:

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

Schily sh ne fait même rien s'il est -présent dans les arguments:

$ 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
la source
Je ne comprends pas pourquoi les gens un lien vers n'importe où , mais le premier ... vous pourriez vous parler de la différence entre set -- $unset, set - $unset, set $unsetet , set "$unset"et ainsi de suite - il est généralement ces écarts qui obtiennent les gens dans ce genre de problème en premier lieu.
mikeserv
@mikeserv: Eh bien, j'ai ajouté plus de détails, mais je n'ai pas compris ce que vous voulez dire lorsqu'il est utilisé $unset.
cuonglm
@cuonglm La commande set $unsetagira exactement de la même manière que setpour une variable non définie. Mais set "$unset" ne le fera pas, si unsetest en fait une variable non définie. A set - $unsetsupprime les options -vet -xset (en bash).
@BinaryZebra: Ah, bien sûr, pour moi, il vaut mieux l'utiliser unset_var. Et notez également qu'il set "$unset"est en réalité défini $1sur vide. Cela concerne l'expansion du shell, pas strictement set, donc je ne le mentionne pas.
cuonglm
1
@mikeserv: Les comportements de poshet yashsont différents lorsqu'ils -apparaissent. Vous pouvez lire ma mise à jour (et n'hésitez pas à l'améliorer).
cuonglm
2

Si vous travaillez à l'intérieur d'un shell bash, tapez help set.

À la fin de l'aide imprimée, lisez:

Si aucun ARG n'est donné, toutes les variables du shell sont imprimées.

Ainsi, un argument no setaffiche toutes les variables connues du shell.


la source
Je me demande si ce set -x; setserait utile
ILMostro_7