#1 Le 22/02/2020, à 09:11
- diesel
[RESOLU] Question aux experts de BASH
Bonjour,
Dans la documentation de BASH (le man), il est écrit :
GRAMMAIRE DE L'INTERPRÉTEUR
Commandes simples
Une commande simple est une suite d'affectations facultatives de variables, suivie de mots séparés par des blancs et de redirections, et terminée par un opérateur de contrôle.
J'ai du mal à me représenter ce qu'est la "suite d'affectations facultatives de variables" dans une commande simple.
Pouvez-vous m'éclairer ?
Amicalement.
Jean-Marie
Dernière modification par diesel (Le 22/02/2020, à 10:45)
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#2 Le 22/02/2020, à 09:57
- pingouinux
Re : [RESOLU] Question aux experts de BASH
Bonjour,
Tu peux définir ou redéfinir des variables d'environnement avant la commande, qui ne seront prises en compte que pour cette commande.
Exemple :
$ LC_TIME=en_US.UTF-8 date
Sat Feb 22 09:54:46 CET 2020
$ LC_TIME=fr_FR.utf8 date
samedi 22 février 2020, 09:55:07 (UTC+0100)
Hors ligne
#3 Le 22/02/2020, à 10:01
- diesel
Re : [RESOLU] Question aux experts de BASH
Merci Pinguoinux,
Et ça ne vaut que pour des variables d'environnement ou aussi pour des variables "normales" ? Ou faut-il parler de "paramètres" pour les variables "normales" ?
Amicalement.
Jean-Marie
Dernière modification par diesel (Le 22/02/2020, à 10:02)
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#4 Le 22/02/2020, à 10:27
- pingouinux
Re : [RESOLU] Question aux experts de BASH
Tu peux définir ainsi n'importe quelle variable.Pour le meilleur terme à utiliser, je ne sais pas.
Hors ligne
#5 Le 22/02/2020, à 10:44
- diesel
Re : [RESOLU] Question aux experts de BASH
Merci pour tout Pingouinux.
Quand je pense que j'ai écrit des codes comme ça :
ifs_sav=$IFS
IFS=":"
commande_ayant_besoin_de_deux_points_comme_separateur
IFS=$ifs_sav
unset ifs_sav
alors qu'il m'aurait suffit d'écrire :
IFS=":" commande_ayant_besoin_de_deux_points_comme_separateur
Amicalement.
Jean-Marie
Dernière modification par diesel (Le 22/02/2020, à 10:45)
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#6 Le 22/02/2020, à 11:50
- kamaris
Re : [RESOLU] Question aux experts de BASH
Le problème de cette formulation :
IFS=":" commande_ayant_besoin_de_deux_points_comme_separateur
c'est que, étant donné l'ordre dans lequel bash traite la ligne de commande, la modification de l'IFS ne s'appliquera pas forcément comme on croit.
S'il s'agit vraiment de modifier l'IFS pour commande_ayant_besoin_de_deux_points_comme_separateur, alors ça ira.
Exemple avec read :
$ IFS=':' read -a a < <(echo '1:2:3')
$ echo "${a[*]}"
1 2 3
$
Mais s'il s'agit de modifier l'IFS pour des développements de variables sur la ligne de commande courante, alors ça n'ira pas.
Exemple avec echo :
$ a=(1 2 3)
$ IFS=':' echo "${a[*]}"
1 2 3
$
Dans ce cas-là, le mieux est semble-t-il de faire
$ (IFS=':'; echo "${a[*]}")
1:2:3
$
qui évite d'avoir à sauvegarder / restaurer l'IFS.
Pourquoi ce comportement ? Parce que (cf. passages en gras) :
When a simple command is executed, the shell performs the following expansions, assignments, and redirections, from left to right.
1. The words that the parser has marked as variable assignments (those preceding the command name) and redirections are saved for later processing.
2. The words that are not variable assignments or redirections are expanded. If any words remain after expansion, the first word is taken to be the name of the command and the remaining words are the arguments.
3. Redirections are performed as described above under REDIRECTION.
4. The text after the = in each variable assignment undergoes tilde expansion, parameter expansion, command substitution, arithmetic expansion, and quote removal before being assigned to the variable.
Dernière modification par kamaris (Le 22/02/2020, à 12:21)
Hors ligne
#7 Le 22/02/2020, à 12:58
- diesel
Re : [RESOLU] Question aux experts de BASH
Merci Kamaris pour ces précisions.
Et avant que Watael vienne y mettre son grain de sel ; dans le shell courant, ça donne
jean-marie@jean-marie:~$ { IFS=':'; echo "${a[*]}"; }
1:2:3
jean-marie@jean-marie:~$
[EDIT]
Attention, ça ne marche pas !
[/EDIT]
Amicalement.
Jean-Marie
Dernière modification par diesel (Le 22/02/2020, à 13:51)
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#8 Le 22/02/2020, à 13:36
- kamaris
Re : [RESOLU] Question aux experts de BASH
Oui mais non, justement, parce que comme ça tu changes l'IFS du shell courant.
L'intérêt des parenthèses est de limiter la portée du changement d'IFS au sous-shell qu'elles engendrent :
$ a=(1 2 3)
$ (IFS=':'; echo "${a[*]}")
1:2:3
$ echo "${a[*]}"
1 2 3
$
Alors que :
$ a=(1 2 3)
$ { IFS=':'; echo "${a[*]}"; }
1:2:3
$ echo "${a[*]}"
1:2:3
$
Dernière modification par kamaris (Le 22/02/2020, à 13:37)
Hors ligne
#9 Le 22/02/2020, à 13:49
- diesel
Re : [RESOLU] Question aux experts de BASH
Oui, effectivement,
IFS=':'; echo "${a[*]}"
n'est pas une commande simple.
Ceci explique cela.
Amicalement.
Jean-Marie
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne