2009-12-29 4 views
1

J'ai un script bash qui génère une commande SCP à exécuter. Les parties pertinentes du code ressemblent à ceci:Vous ne pouvez pas SCP un chemin avec des espaces de script bash?

echo $COPY_CMD 
$COPY_CMD 

Ma sortie ressemble à ceci:

 
[email protected]:~/Desktop/video_final$ ./xfervids.sh 
scp "/media/My Book/PhotosVideos/Videos/18May2008Download/SD_VIDEO/PRG001/MOV056.MOD" [email protected]:./video_working/ 
[email protected]'s password: 
"/media/My: No such file or directory 
Book/PhotosVideos/Videos/18May2008Download/SD_VIDEO/PRG001/MOV056.MOD": No such file or directory 

Toutefois, quand je prends la ligne 2 de ma sortie: scp "/media/..., le copier et le coller dans le terminal, ça marche.

Qu'est-ce que je fais mal? J'ai essayé d'échapper à l'espace dans "My Book" ("My\ Book"), en mettant deux caractères \ au lieu d'un ("My\\ Book") mais je ne peux pas obtenir ce comportement constant. Aidez-moi?

Répondre

5

Vous devez être extrêmement vigilant lorsqu'il y a des espaces dans les noms de chemin.

Dans le contexte, vous avez probablement besoin:

eval $COPY_CMD 

Vous n'avez pas besoin de guillemets autour cette fois la variable.

+1

Était complètement ignorant de la commande 'eval' bash. Je vous remercie! – poundifdef

4

Vous devez lire this discussion sur comment et pourquoi éviter d'insérer des commandes dans les variables et this discussion sur les implications de sécurité de eval. Une des raisons pour lesquelles vous souhaitez utiliser les variables de cette manière est de consigner ou d'afficher les actions effectuées par un script. Des problèmes surviennent avec la capacité de citer ou d'échapper correctement des espaces, etc., comme vous l'avez découvert. Une façon de faire ce que vous voulez est d'utiliser set -x et set +x pour activer et désactiver ce type de sortie à différents points de votre script.

+0

Probablement trop pour mon petit script de gravure de DVD à la maison, mais de bonnes infos quand même. – poundifdef

Questions connexes