#1 Le 29/11/2018, à 14: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, à 17:43)
Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04, GNOME 3.36.8
24.04 en cours de tests
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, à 16: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, à 17: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é
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, GNOME 3.36.8
24.04 en cours de tests
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, à 20: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..
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#5 Le 30/11/2018, à 21: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, GNOME 3.36.8
24.04 en cours de tests
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