Problème dans le script avec des espaces dans le nom de fichier

11

J'ai un script qui scp est un fichier de l'hôte distant au local. Parfois, les noms de fichiers contiennent des espaces. scp n'aime pas les espaces dans ses noms de fichiers. Pour une raison quelconque, mes tentatives de gestion des espaces n'ont pas abouti au chemin scp correct.

Code:

PATH=/var/root/Documents/MyFile OG-v1.2.3.pkg
scp $PATH Me@10.1.10.33:/Users/Me/Desktop

Résulte en

Cannot find directory: var/root/Documents/MyFile
Cannot find directory: OG-v1.2.3.pkg

Mettre PATH entre guillemets "$PATH"donne la même erreur.

L'échange des espaces contre des espaces échappés ne fonctionne pas non plus, bien que pour autant que je sache, cela devrait:

ESC_PATH=${PATH/' '/'\ '}

bien que l'impression du chemin d'échappement montre que la modification a fonctionné:

echo $ESC_PATH
> /var/root/Documents/MyFile\ OG-v1.2.3.pkg
Miles Alden
la source
4
Veuillez ne pas utiliser $PATHpour vos propres variables, car votre terminal en a besoin.
Bernhard

Réponses:

19

Vous devez citer à la fois la déclaration et l'utilisation

path="/var/root/Documents/MyFile OG-v1.2.3.pkg"
scp "$path" Me@10.1.10.33:/Users/Me/Desktop

Si vous ne citez pas la première, $pathne contiendra que la première partie. Si vous ne citez pas la seconde, scptraitera chaque partie séparée par des espaces comme un argument.

(J'ai changé $PATHen $pathcar $PATHest une variable réservée importante et vous ne devez pas l'utiliser à des fins générales.)

Matteo
la source
1
Parfait! Merci un million @Matteo. Il s'avère qu'il y avait aussi un espace préfixé qui y jetait une clé.
Miles Alden
1

J'essayais quelque chose de très similaire avec ssh et je passais une ligne de commande à travers. par exemple

ssh <somehost> ls -l "$PATH"

J'ai trouvé que la simple définition de "$ PATH" ne faisait pas l'affaire - cela a quand même généré des erreurs. Mais si je courais

ssh <somehost> ls -l "\"$PATH"\"

Cela a fonctionné. L'astuce consiste à s'assurer qu'un ensemble supplémentaire de "" est transmis à la commande ssh à partir du shell.

Roland Ward
la source