Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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) :

man bash a écrit :

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