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 29/11/2018, à 15:39

Arbiel

[Résolu] je ne comprends pas le fonctionnement de read

Bonjour à tous

Voici l'objet de mon incompréhension

remi@remi-Vostro-3550:~$ alias e
alias e='function __ { for _ in "${@}"; do declare -p ${_} ; done ; } ; __'
remi@remi-Vostro-3550:~$ fc=/etc/crypttab
remi@remi-Vostro-3550:~$  grep -v -E "^([[:space:]]*$|[[:space:]]*(#+|[^[:space:]]+ [^[:space:]]+ none))" "${fc}" | head -n 1
victor-root UUID=78576555-f0c2-4c80-af4f-d763cc7ae71d /dev/disk/by-uuid/4146dfad-26f0-4aec-99c3-8ab00c3e4297:/.ckf/victor-root:5 luks,keyscript=/lib/cryptsetup/scripts/passdev
remi@remi-Vostro-3550:~$ IFS=" "
remi@remi-Vostro-3550:~$ grep -v -E "^([[:space:]]*$|[[:space:]]*(#+|[^[:space:]]+ [^[:space:]]+ none))" "${fc}" | head -n 1 | read nom vol cle options ;
remi@remi-Vostro-3550:~$ e nom vol cle options
bash: declare: nom : non trouvé
bash: declare: vol : non trouvé
bash: declare: cle : non trouvé
bash: declare: options : non trouvé
remi@remi-Vostro-3550:~$ 

Je veux traiter une ligne du fichier /etc/crypttab que je sélectionne dans le code ci-dessus par

remi@remi-Vostro-3550:~$  grep -v -E "^([[:space:]]*$|[[:space:]]*(#+|[^[:space:]]+ [^[:space:]]+ none))" "${fc}" | head -n 1
victor-root UUID=78576555-f0c2-4c80-af4f-d763cc7ae71d /dev/disk/by-uuid/4146dfad-26f0-4aec-99c3-8ab00c3e4297:/.ckf/victor-root:5 luks,keyscript=/lib/cryptsetup/scripts/passdev

J'en extrais les parties par

grep -v -E "^([[:space:]]*$|[[:space:]]*(#+|[^[:space:]]+ [^[:space:]]+ none))" "${fc}" | head -n 1 | read nom vol cle options ;

et je constate que je ne récupère rien

remi@remi-Vostro-3550:~$ e nom vol cle options
bash: declare: nom : non trouvé
bash: declare: vol : non trouvé
bash: declare: cle : non trouvé
bash: declare: options : non trouvé
remi@remi-Vostro-3550:~$ 

Je ne récupère les parties que dans une boucle while read

remi@remi-Vostro-3550:~$ grep -v -E "^([[:space:]]*$|[[:space:]]*(#+|[^[:space:]]+ [^[:space:]]+ none))" "${fc}" | head -n 1 | while read nom vol cle options ; do e nom vol cle options; break; done; e nom vol cle options
declare -- nom="victor-root"
declare -- vol="UUID=78576555-f0c2-4c80-af4f-d763cc7ae71d"
declare -- cle="/dev/disk/by-uuid/4146dfad-26f0-4aec-99c3-8ab00c3e4297:/.ckf/victor-root:5"
declare -- options="luks,keyscript=/lib/cryptsetup/scripts/passdev"
bash: declare: nom : non trouvé
bash: declare: vol : non trouvé
bash: declare: cle : non trouvé
bash: declare: options : non trouvé
remi@remi-Vostro-3550:~$ 

Je n'ai lu nulle part que read s'exécute dans son propre environnement.

Qu'en est-il exactement ?

Arbiel

Dernière modification par Arbiel (Le 29/11/2018, à 18:43)


Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.

Hors ligne

#2 Le 29/11/2018, à 17:31

Watael

Re : [Résolu] je ne comprends pas le fonctionnement de read

salut,

je passe sur l'alias qui pinte vers la déclaration d'une fonction, sur les noms de fonctions et de variables merdiques...

un pipe crée un sous-interpréteur en dehors duquel les variables qui y sont déclarées, créées, modifiées, n'existent pas.

$ echo foo | read var; echo "$var"
$ echo foo | { read var; echo "$var";}
foo

ce comportement est modifiable par l'option shell lastpipe; en gros, dans un script uniquement.
cf. man bash /lastpipe


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#3 Le 29/11/2018, à 18:42

Arbiel

Re : [Résolu] je ne comprends pas le fonctionnement de read

Bonsoir

Je te remercie.

Pour l'alias, je l'ai présenté pour montrer l'origine du résultat de "e x y z". Je ne sais pas bien ce qu'il convient de faire, entre écrire un alias et une fonction. Je veux dire par là que je ne distingue pas les avantages et inconvénients des deux membres de cette alternative. L'alias fonctionne et me donne satisfaction, mais je reconnais volontiers qu'il n'est pas limpide

Pour ce qui concerne le pipeline, j'avais complètement oublié

Bash Reference Manual/3.2.2 Pipelines a écrit :

Each command in a pipeline is executed in its own subshell

et ce n'est pas la première fois que je m'y fais prendre.

Je vais appliquer la solution que tu proposes, ou rediriger l'entrée standard

remi@remi-Vostro-3550:~$ x=$(echo toto) ; read var <<< $x ; echo $var
toto
remi@remi-Vostro-3550:~$ 

Merci encore

Arbiel


Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.

Hors ligne

#4 Le 29/11/2018, à 21:46

Watael

Re : [Résolu] je ne comprends pas le fonctionnement de read

un alias, c'est pour avoir un nom court pour une commande longue, ou complexe.

une fonction, permet en plus d'utiliser des paramètres positionnels, et une fois qu'elle est déclarée, il n'est pas nécessaire de recommencer : tu ne déclares pas une fonction chaque fois que tu l'utilises !
le but c'est aussi de ne pas réécrire du code qui se répète dans le script.

mais les deux, ensembles.. hmm


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#5 Le 30/11/2018, à 22:11

Arbiel

Re : [Résolu] je ne comprends pas le fonctionnement de read

Bonsoir

Effectivement, mon alias "e" n'est pas logique. Enfin, il ne l'est plus.

J'aurais dû le remettre en cause lorsque j'ai découvert la fonction interne de bash "declare -p" qui permet d'en simplifier l'écriture :

remi@remi-Vostro-3550:~$ x=12
remi@remi-Vostro-3550:~$ y=toto
remi@remi-Vostro-3550:~$ z='keep is simple, stupid'
remi@remi-Vostro-3550:~$ alias e=
remi@remi-Vostro-3550:~$ e x y z
x : commande introuvable
remi@remi-Vostro-3550:~$ alias e='declare -p'
remi@remi-Vostro-3550:~$ e x y z
declare -- x="12"
declare -- y="toto"
declare -- z="keep is simple, stupid"
remi@remi-Vostro-3550:~$ 

Il contenait initialement la commande "echo", et je ne voulais pouvoir entrer "e x y z" comme ci-dessus pour afficher le contenu des variables x y et z. Je ne sais plus exactement comment j'avais fait, mais il m'était impossible, ou m'était paru impossible, d'obtenir ce résultat sans passer par une fonction. En découvrant declare, je me suis contenté le remplacer "echo" et vraisemblablement quelques lignes supplémentaires par "declare" sans pousser plus avant ma réflexion.

Mais, peu importe. Je vais modifier cet alias.

Merci encore pour tes conseils, que tu me prodigues depuis maintenant un certain temps.

Arbieil


Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.

Hors ligne