OS : Ubuntu 16.04.3
Shell : Bash 4.3.48
Je sais qu'il est possible de changer temporairement le contenu d'une variable comme dans var=value command
, étant probablement IFS= read -r var
le cas le plus notable de cela.
Et, grâce au wiki de Greg , je comprends aussi:
# Why this
foo() { echo "$var"; }
var=value foo
# And this does work
var=value; echo "$var"
# But this doesn't
var=value echo "$var"
Ce qui échappe à ma compréhension, c'est ceci:
$ foo() { echo "${var[0]}"; }
$ var=(bar baz) foo
(bar baz)
Pour autant que je sache (et en suivant la logique des exemples précédents), il devrait imprimer bar
, non (bar baz)
.
Est-ce que cela m'arrive seulement? Est-ce le comportement souhaité et il me manque quelque chose? Ou est-ce un bug?
export var=(foo bar); echo "${var[0]}"
il imprimefoo
, non(foo bar)
.export
montre:declare -ax var=([0]="foo" [1]="bar")
export i_am_array=(foo bar); /usr/bin/env | grep i_am_array
ne donne aucune sortie ici.foo() { declare -p var; } ; var=(bar baz) foo
donne ladeclare -x var="(bar baz)"
confirmation qu'il est traité comme une chaîne, pas comme un tableauRéponses:
Appelant généralement:
où
cmd
est une fonction n'est pas portable.Avec
bash
, cela ne fonctionne que pour les variables scalaires (et avecx=(...)
analysé en tant que tableau mais affecté en tant que scalaire) et il y a un certain nombre de problèmes avec la portée si vous le faites, avecksh93
etyash
, cela fonctionne mais la définition de la variable reste après. Avecmksh
, vous obtenez une erreur de syntaxe. Dans le shell Bourne, cela ne fonctionnait pas du tout, même pour les variables scalaires.Notez également que même avec des variables scalaires, le fait que la variable soit ou non exportée dans la fonction (c'est-à-dire passée aux commandes en cours d'exécution) varie d'un shell à l'autre (c'est en bash, yash, mksh, zsh, mais pas en ksh, cendre).
Cela ne fonctionne que comme vous vous en doutez
zsh
. Notez que leszsh
indices de tableau commencent à 1.la source
Ce n'est pas seulement un bug, il semble que ce soit une fonctionnalité non implémentée sans aucun plan de l'être. Ce message de la liste de diffusion de 2014 a ceci du créateur:
Tirant du dernier dépôt git pour Bash a ceci dans
variables.c
:Suggérer que tout ce qui s'y trouve n'est pas complet.
la source
execve()
appel système n'est impliqué. Voirzsh
pour un shell qui prend en charge les fonctions d'appel avec un tableau temporairement défini de cette façon.my_var=one func_bar
. Peut-on dire que celaexport
ajoute à l'environnement et donc, l'exportation est utilisée ici, sous le capot? Regardez ma réponse, j'ai ajouté le code de démonstration.À partir de la
man bash
section BUGS de (la version de labash
4.3 est):Le code suivant montre qu'une variable temporaire existe dans l'environnement, uniquement pendant l'exécution de la fonction. Une fois la fonction terminée, la variable temporaire disparaît.
Informations connexes:
VAR=VALUE some-command
construction.la source