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

Résolu
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 ( :

--
:(){ :|:& };:

2 réponses

  1. Contributeur
    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
    1. J'ai bien évidemment fait toute une série de tests avant de poster
      0
  2. Contributeur
    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
    1. Contributeur
      Les guillemets aussi, d'ailleurs. Donc
      if ($uuid =~ /$u/) {
      suffit.
      0
    2. 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