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 gaaaaaAab . Évalué à 3.
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 santos . Évalué à 4.
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 mitch007 . Évalué à 1.
Jp
[^] # Re: sed si l'adresse est variable
Posté par santos . Évalué à 1.
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 gaaaaaAab . Évalué à 2.
et tant qu'à tétracapillotomer, ce serait plutôt addbackslashes ;-)
[^] # Re: sed si l'adresse est variable
Posté par mitch007 . Évalué à 1.
%%%%%%%%%%%%%%%%%%%%%%%%%%
#!/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 mitch007 . Évalué à 1.
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 :(
[^] # Re: sans eval uniquement avec des quotes doubles quotes contres quotes
Posté par gaaaaaAab . Évalué à 2.
Comme ça alors ?
#!/bin/csh
set mavar="/home/roger/mes\ prog/echo"
"$mavar" titi
exit
[^] # Re: sans eval uniquement avec des quotes doubles quotes contres quotes
Posté par mitch007 . Évalué à 1.
/home/salmon/tex/temp/un' 'deux/echo: Command not found.
[^] # Re: sans eval uniquement avec des quotes doubles quotes contres quotes
Posté par ecid . Évalué à 2.
#!/bin/csh
set mavar="/home/user1/un deux/echo"
"$mavar" titi
exit
fonctionne sans problème ...
[^] # Re: sans eval uniquement avec des quotes doubles quotes contres quotes
Posté par mitch007 . Évalué à 2.
Comment puis-je connaitre la version de mon csh ?
Jp
[^] # Re: sans eval uniquement avec des quotes doubles quotes contres quotes
Posté par gaaaaaAab . Évalué à 1.
bon, là, on sort de mon domaine de compétence ... il faudrait un windows pour pouvoir tester des trucs sur cygwin ...
la commande eval ne fonctionne pas sur le csh cygwin ? ou tu ne peux/veux pas l'utiliser ?
[^] # Re: sans eval uniquement avec des quotes doubles quotes contres quotes
Posté par ecid . Évalué à 1.
En lançant le setup de cygwin, tu peux voir ce qui est installé, ainsi que les versions (section shell de cygwin).
# Tu te compliques la vie
Posté par Kerro . Évalué à 2.
set mavar="/home/roger/mes prog/echo"
"$mavar" titi
exit
[^] # Re: Tu te compliques la vie
Posté par mitch007 . Évalué à 1.
http://linuxfr.org/forums/26/24466.html#921065
et ne fonctionne pas sous cygwin :(
[^] # Re: Tu te compliques la vie
Posté par mitch007 . Évalué à 2.
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 Kerro . Évalué à 3.
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.