Forum Programmation.shell Un espace dans le path et l'execution devient impossible

Posté par  .
Étiquettes : aucune
0
9
avr.
2008
J'aimerai stocker dans une variable le nom et le chemin d'un programme puis exécuter la commande stockée dans cette variable.
Le problème étant que le chemin peut comporter des nom de répertoire avec des espaces le tout en csh, exemple:

Soit test1.csh:
#######################
#!/bin/csh
# test1.csh
set mavar="echo"
$mavar titi
exit
#######################
L'exécution de test1.csh fonctionne bien
>test1
titi

Maintenant je copie la commande echo
>cp /usr/bin/echo /home/roger/mes' 'prog/echo

Je vérifie que la commande est bien copiée
>/home/roger/mes' 'prog/echo titi
titi

Soit test2.csh:
#######################
#!/bin/csh
set mavar="/home/roger /mes' 'prog/echo"
$mavar titi
exit
#######################
L'exécution de test2.csh provoque l'erreur suivante:
>test2
/home/roger/mes': Command not found.

Que puis je faire avec des quotes, double quotes ou des guillemets pour prendre en compte l’espace dans le chemin lors de l'exécution?
Cordialement,
Jp
  • # eval

    Posté par  . Évalué à 3.

    simplement en rajoutant eval avant l'appel à $mavar, ça le fait chez moi

    Sinon, pour économiser 1 caractère (la nature te dira merci ;), tu peux échapper l'espace avec \. Du coup, test2.csh devient :


    #!/bin/csh

    set mavar="/home/roger/mes\ prog/echo"
    eval $mavar titi

    exit


    ouala !
    • [^] # sed si l'adresse est variable

      Posté par  . Évalué à 4.

      si "/home/roger/mes prog/echo" est une chaine variable (non écrite en dur dans le code), utilise sed pour ajouter automatiquement les \ :

      mavar=$(echo "$mavar" | sed 's/\ /\\ /g')

      Les espaces dans les chemins, c'est un fléeau... il faut à tout prix les éviter (utiliser plutôt _)
      • [^] # Re: sed si l'adresse est variable

        Posté par  . Évalué à 1.

        Merci François pour l'astuce ! Mais mon vrai problème c'est comment ne pas utiliser eval pour régler mon problème :(

        Jp
        • [^] # Re: sed si l'adresse est variable

          Posté par  . Évalué à 1.

          Dans ce cas, fais-toi une espèce de fonction "addslashes" :

          function addslashes()
          {
          echo "$1" | sed 's/\ /\\ /g'
          }


          Après, dans ton script, chaque fois que tu manipules une variable contenant un chemin, susceptible de contenir des espaces, remplace :

          ls $monChemin

          par

          ls $(addslashes "$monChemin")

          (exemple avec la commande ls)
          • [^] # Re: sed si l'adresse est variable

            Posté par  . Évalué à 2.

            juste en passant, tu peux économiser l'échappement de l'espace dans le motif de recherche de ton sed.

            et tant qu'à tétracapillotomer, ce serait plutôt addbackslashes ;-)
            • [^] # Re: sed si l'adresse est variable

              Posté par  . Évalué à 1.

              Non désolé ça ne marche pas non plus:

              %%%%%%%%%%%%%%%%%%%%%%%%%%
              #!/bin/csh
              set coucou="echo sqd"
              set coucou="/home/roger/tex/temp/un\\ deux/echo"
              "$coucou" sqd
              exit
              %%%%%%%%%%%%%%%%%%%%%%%%%%
              >test.csh

              /home/roger/tex/temp/un\\ deux/echo: Command not found.
  • # sans eval uniquement avec des quotes doubles quotes contres quotes

    Posté par  . Évalué à 1.

    Salut gaaaaaAab !

    Effectivement, eval permet d'executer le contenu de ma variable mais je voudrai le faire sans eval mais uniquement avec des quote double quote contre quote... ça doit être possible non?

    Jp

    PS: je ne comprend pas : je dois avoir un pb avec ce forum car je ai déjà posté cette réponse mais elle ne s'est pas affichée :(
  • # Tu te compliques la vie

    Posté par  . Évalué à 2.

    #!/bin/csh
    set mavar="/home/roger/mes prog/echo"
    "$mavar" titi
    exit
    • [^] # Re: Tu te compliques la vie

      Posté par  . Évalué à 1.

      Merci Kerro mais cette solution à déjà était proposée:
      http://linuxfr.org/forums/26/24466.html#921065

      et ne fonctionne pas sous cygwin :(
      • [^] # Re: Tu te compliques la vie

        Posté par  . Évalué à 2.

        Merci pour toutes vos réponses rapide (dommage qu'il y ait des problèmes techniques pour poster sur ce forum)
        Voilà finalement toutes les technique qui permettent de faire ce que je veux:
        ##########################
        #!/bin/csh
        set coucou="/home/roger/mes prog/echo"
        set coucou='/home/roger/mes prog/echo'
        set coucou=/home/roger/mes" "prog/echo
        set coucou=/home/roger/mes' 'prog/echo
        set coucou=/home/roger/mes\ prog/echo
        set coucou=/home/roger/mes?prog/echo
        "$coucou" toto
        set coucou="/home/roger/mes\ prog/echo"
        set coucou='/home/roger/mes\ prog/echo'
        eval "$coucou" titi
        exit
        ##########################

        Merci encore !

        J'espère que cette fois mon message passera sur le forum :(

        Jp
      • [^] # Cygwin

        Posté par  . Évalué à 3.

        Je viens de tester sous Cygwin, et ça fonctionne parfaitement.

        En Bash, j'ai testé en Bash.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.