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 28/11/2024, à 10:34

lebossejames

obtenir résultat commande dans variable

Bonjour,

J'essaye de récupérer le résultat de cette commande, mais à chaque fois j'obtiens une chaine vide:

pointAlreadyMounted=$(sudo mount | grep 'sda2' | awk -F " " '{print $3}')
echo "TT:"$pointAlreadyMounted

Sauriez-vous me dire d'où viendrait le problème svp?

Merci d'avance.

Hors ligne

#2 Le 28/11/2024, à 10:43

sputnick

Re : obtenir résultat commande dans variable

Salut,

pas besoin d’être root, et pas besoin de grep:

mount | awk '$1=="/dev/sda2" && $3=="/"{print "mounted"}'

Negative people have a problem for every solution.
https://sputnick.fr

Hors ligne

#3 Le 28/11/2024, à 14:46

lebossejames

Re : obtenir résultat commande dans variable

sputnick a écrit :

Salut,

pas besoin d’être root, et pas besoin de grep:

mount | awk '$1=="/dev/sda2" && $3=="/"{print "mounted"}'

J'ai lancer cette commande dans le terminal ça ne me retourne rien? Je precise que le mount seul me retourne ceci:

sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,relatime)
udev on /dev type devtmpfs (rw,nosuid,relatime,size=3945680k,nr_inodes=246605,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,nodev,noexec,relatime,size=824160k,mode=755)
/dev/mmcblk0p2 on / type ext4 (rw,noatime)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)
cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate,memory_recursiveprot)
pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime)
bpf on /sys/fs/bpf type bpf (rw,nosuid,nodev,noexec,relatime,mode=700)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=29,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=6192)
mqueue on /dev/mqueue type mqueue (rw,nosuid,nodev,noexec,relatime)
debugfs on /sys/kernel/debug type debugfs (rw,nosuid,nodev,noexec,relatime)
tracefs on /sys/kernel/tracing type tracefs (rw,nosuid,nodev,noexec,relatime)
configfs on /sys/kernel/config type configfs (rw,nosuid,nodev,noexec,relatime)
fusectl on /sys/fs/fuse/connections type fusectl (rw,nosuid,nodev,noexec,relatime)
ramfs on /run/credentials/systemd-sysusers.service type ramfs (ro,nosuid,nodev,noexec,relatime,mode=700)
ramfs on /run/credentials/systemd-sysctl.service type ramfs (ro,nosuid,nodev,noexec,relatime,mode=700)
ramfs on /run/credentials/systemd-tmpfiles-setup-dev.service type ramfs (ro,nosuid,nodev,noexec,relatime,mode=700)
systemd-1 on /home/pi/Desktop/Services type autofs (rw,relatime,fd=44,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=6328)
/dev/mmcblk0p1 on /boot/firmware type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,errors=remount-ro)
ramfs on /run/credentials/systemd-tmpfiles-setup.service type ramfs (ro,nosuid,nodev,noexec,relatime,mode=700)
binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,nosuid,nodev,noexec,relatime)
sunrpc on /run/rpc_pipefs type rpc_pipefs (rw,relatime)
tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=824144k,nr_inodes=206036,mode=700,uid=1000,gid=1000)
gvfsd-fuse on /run/user/1000/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)
portal on /run/user/1000/doc type fuse.portal (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)
//192.168.0.16/sambashare on /home/pi/Desktop/Services type cifs (ro,relatime,vers=3.1.1,cache=strict,username=user1,domain=WORKGROUP,uid=1000,forceuid,gid=1000,forcegid,addr=192.168.0.16,file_mode=0755,dir_mode=0755,iocharset=utf8,soft,nounix,serverino,mapposix,reparse=nfs,rsize=4194304,wsize=4194304,bsize=1048576,retrans=1,echo_interval=60,actimeo=1,closetimeo=1,x-systemd.automount)
/dev/sda2 on /media/pi/UEFI_NTFS type vfat (rw,nosuid,nodev,relatime,uid=1000,gid=1000,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,showexec,utf8,flush,errors=remount-ro,uhelper=udisks2)
/dev/sda1 on /media/pi/COCO type ntfs3 (rw,nosuid,nodev,relatime,uid=1000,gid=1000,windows_names,iocharset=utf8,uhelper=udisks2)

Hors ligne

#4 Le 28/11/2024, à 15:00

nany

Re : obtenir résultat commande dans variable

Bonjour,



La commande de sputnick n’affiche « mounted » que si /dev/sda2 est monté sur /.

Or ce que tu cherches est d’afficher le point de montage de sda2.
Donc, en reprenant ton message #1 et en tenant compte de la remarque de sputnick, on peut mettre ceci :

pointAlreadyMounted=$(mount | awk '/sda2/{print $3}')
echo "TT: $pointAlreadyMounted"

Hors ligne

#5 Le 28/11/2024, à 15:50

sputnick

Re : obtenir résultat commande dans variable

Plus précisément:

pointAlreadyMounted=$(mount | awk '$1=="/dev/sda2"{print $3}')
echo "TT: $pointAlreadyMounted"

Negative people have a problem for every solution.
https://sputnick.fr

Hors ligne

#6 Le 28/11/2024, à 19:40

RaphaelG

Re : obtenir résultat commande dans variable

L'idée 1ère de sputnick d'éviter l'echo est interessante.

mount | awk '$1=="/dev/sda2" {printf  "TT: "; print $3}'

C'est la 1ère fois que j'utilise printf à l'intérieur de awk. Est ce universel ? bash ? dash ? POSIX ?

Edit: J'ai fait des essais, bash et dash marchent, au moins dans notre distro préférée donc avec mawk. nawk ?

Dernière modification par RaphaelG (Le 28/11/2024, à 19:44)

Hors ligne

#7 Le 28/11/2024, à 20:27

nany

Re : obtenir résultat commande dans variable

RaphaelG a écrit :

L'idée 1ère de sputnick d'éviter l'echo est interessante.

Certes mais ça ne répond pas à la question du demandeur à savoir récupérer le résultat d’une commande dans un variable.
Je suppose que l’echo n’est là que pour vérifier le contenu de la variable.

RaphaelG a écrit :

C'est la 1ère fois que j'utilise printf à l'intérieur de awk. Est ce universel ? bash ? dash ? POSIX ?

Je ne connais pas la réponse mais, dans le cas présent, on peut s’en passer avec seulement {print  "TT: "$3}.

[edit]Ou {printf "TT: %s", $3}[/edit]

Dernière modification par nany (Le 28/11/2024, à 20:32)

Hors ligne

#8 Le 28/11/2024, à 21:02

Watael

Re : obtenir résultat commande dans variable

ce n'est d'ailleurs pas ainsi qu'on s'en sert :

mount | awk '$1=="/dev/sda2" {printf("TT: %s\n",$3)}'

à l'instar des variables, les commandes internes du shell et de awk ne sont pas les mêmes.
printf existe en commande externe sous /usr/bin, masi aussi en commande interne de bash, dash, awk, et d'autres langages probablement.

edit: oops. `raté l'edit de nany.

Dernière modification par Watael (Le 28/11/2024, à 21:03)


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

Hors ligne

#9 Le 29/11/2024, à 05:07

sputnick

Re : obtenir résultat commande dans variable

RaphaelG a écrit :

C'est la 1ère fois que j'utilise printf à l'intérieur de awk. Est ce universel ? bash ? dash ? POSIX ?

@Watael a répondu pour les différentes versions de printf. Par contre, la syntaxe n'est pas la même entre
- C
- Perl
- shell
- awk

et potentiellement d'autres outils langages.

Mais les arguments de formatage¹ comme %s/%d... sont en général les mêmes. Ce qui change, c'est le besoin de mettre des parenthèses pour regrouper et une virgule entre les 2 arguments.

Un peu de doc en anglais:

http://www.bash-hackers.org/wiki/doku.p … tin/printf

https://www.knowprogram.com/c-programming/printf-in-c/

¹

    %b : unicode et ANSI sequences: \t etc...
    %c: single character
    %d: decimal number
    %e: exponential
    %f: float
    %g: e or f, whichever is shorter
    %o: octal number
    %s: string
    %x: hexadecimal number 

Negative people have a problem for every solution.
https://sputnick.fr

Hors ligne

#10 Le 29/11/2024, à 05:18

sputnick

Re : obtenir résultat commande dans variable

Pour afficher mounted or unmounted:

mount | awk '{if ($1=="/dev/sda2") m="mounted"}END{if (m == "mounted") print m; else print "unmounted"}'

Le block END est comme son nom l'indique exécuté à la fin. C'est nécessaire car sinon le résultat peut être affiché plusieurs fois, car /dev/sda2 peux être monté plusieurs fois comme dans Docker et autres.


Negative people have a problem for every solution.
https://sputnick.fr

Hors ligne

#11 Le 29/11/2024, à 05:21

sputnick

Re : obtenir résultat commande dans variable

On peux même passer /dev/sda2 comme un argument à awk:

mount | awk -vdev=/dev/sda2 '{if ($1==dev) m="mounted"}END{if (m == "mounted") print m; else print "unmounted"}'

Negative people have a problem for every solution.
https://sputnick.fr

Hors ligne

#12 Le 29/11/2024, à 05:31

Watael

Re : obtenir résultat commande dans variable

sputnick a écrit :

C'est nécessaire car sinon le résultat peut être affiché plusieurs fois, car /dev/sda2 peux être monté plusieurs fois comme dans Docker et autres.

les docker apparaissent toujours en premiers dans mount ?
même si la partition est montée sur différents points de montage (sans recourir à docker), seul le dernier montage listé par la commande mount sera retenu. hmm


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

Hors ligne

#13 Le 29/11/2024, à 08:49

sputnick

Re : obtenir résultat commande dans variable

J'ai dit une connerie pour docker. Par contre le code est correct, car on doit utiliser le END block pour savoir si on doit afficher "unmounted" une fois parsé toutes les lignes.


Negative people have a problem for every solution.
https://sputnick.fr

Hors ligne

#14 Le 29/11/2024, à 08:53

sputnick

Re : obtenir résultat commande dans variable

Et on peux réduire la commande à:

mount | awk -vdev=/dev/sda2 '$1==dev{m="mounted"}END{if (m == "mounted") print m; else print "unmounted"}'

Negative people have a problem for every solution.
https://sputnick.fr

Hors ligne

#15 Le 29/11/2024, à 15:22

lebossejames

Re : obtenir résultat commande dans variable

sputnick a écrit :

Plus précisément:

pointAlreadyMounted=$(mount | awk '$1=="/dev/sda2"{print $3}')
echo "TT: $pointAlreadyMounted"

ça marche bien, merci.

Hors ligne