Script qui fonctionne en bash mais pas en Perl sniff...

Résolu
LezardMoo Messages postés 554 Date d'inscription   Statut Membre Dernière intervention   -  
LezardMoo Messages postés 554 Date d'inscription   Statut Membre Dernière intervention   -
Bonsoir tout le monde !!

Voilà, je code un petit programme et pour l'instant j'en suis à la portion detection usb.

j'ai donc fait un test en bash


#!/bin/bash

while [ 1 ]
do
if [ -b "/dev/disk/by-uuid/4489-7E11" ] ; then
echo "coucou"
#exit 0
sleep 1
clear
else
echo "pas coucou"
sleep 1
clear
fi
done

On ne peut plus simple.
La même chose en Perl


#!/usr/bin/perl

use strict;
use warnings;

my $u = "4489-7E11";
my $uuid = 'ls -l /dev/disk/by-uuid/';

#print $uuid;
#exit;

while (1) {
if("$uuid" =~ /${u}/) {
print "coucou\n";
sleep(1);
system("clear");
}else {
print "pas coucou\n";
sleep(1);
system("clear");

}
}


Donc le problème:

Suand j'exécute le script bash avec la clé connectée, "coucou" s'affiche, quand je la déconnecte (le script tourne toujours) "pas coucou" s'affiche, tout va bien.

Par contre avec le script perl...
Quand j'exécute le script avec la clé connectée, "coucou" s'affiche, quand je la débranche(le script tourne toujours) "pas coucou" ne s'affiche pas -_-

J'ai l'impression que le script ne repasse pas dans le if et donc par conséquent il ne doit pas repasser avant dans le while...

Qu'en pensez vous ?

Merci d'avance ( :
A voir également:

2 réponses

dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
hello
vérifier ce que retourne, en ligne de commande:
ls -l /dev/disk/by-uuid/ | grep 4489-7E11
et dans perl:
if("$uuid" =~ /${u}/)
0
LezardMoo Messages postés 554 Date d'inscription   Statut Membre Dernière intervention   14
 
J'ai bien évidemment fait toute une série de tests avant de poster
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
Salut LezardMoo,

CCM transforme les backticks (AltGr - 7) en ', mais je suppose que ton
my $uuid = 'ls -l /dev/disk/by-uuid/';
est bien avec des apostrophes arrières.

On peut les remplacer avec l'opérateur équivalent qx.

Cependant, ton problème est que le résultat de
ls
n'est évalué que lors de la déclaration de $uuid et non pas à chaque itération de la boucle.

Donc, il faudrait juste faire
my $uuid;
avant la boucle.

et dans la boucle while, et avant le if :
$uuid = qx(ls -l /dev/disk/by-uuid/);


Par ailleurs, les accolades sont inutiles dans
if("$uuid" =~ /${u}/)
, il suffit de te référer à
$u
.


Dal
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
Les guillemets aussi, d'ailleurs. Donc
if ($uuid =~ /$u/) {
suffit.
0
LezardMoo Messages postés 554 Date d'inscription   Statut Membre Dernière intervention   14
 
Salut [Dal],

tout simplement Merci !

en plus dans le bash le test est dans la boucle ^^
Merci aussi pour l'opérateur, très pratique.

Bonne continuation ( :
0