Probleme im Skript mit Leerzeichen im Dateinamen

11

Ich habe ein Skript, das scp eine Datei vom Remote-Host zurück zum lokalen ist. Manchmal enthalten die Dateinamen Leerzeichen. scp mag keine Leerzeichen in seinen Dateinamen. Aus irgendeinem Grund haben meine Versuche, mit den Leerzeichen umzugehen, nicht zum richtigen scp-Pfad geführt.

Code:

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

Ergebnisse in

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

PFAD in Anführungszeichen setzen "$PATH" führt zu demselben Fehler.

Das Austauschen der Leerzeichen gegen maskierte Leerzeichen funktioniert ebenfalls nicht, obwohl dies meines Erachtens Folgendes sein sollte:

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

Obwohl das Drucken des maskierten Pfads zeigt, dass die Bearbeitung funktioniert hat:

echo $ESC_PATH
> /var/root/Documents/MyFile\ OG-v1.2.3.pkg
Miles Alden
quelle
4
Bitte nicht $PATHfür Ihre eigenen Variablen verwenden, da Ihr Terminal dies benötigt.
Bernhard

Antworten:

19

Sie sollten sowohl die Erklärung als auch die Verwendung angeben

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

Wenn Sie den ersten nicht zitieren, $pathwird nur der erste Teil enthalten. Wenn Sie die zweite nicht zitieren,scp wird jeder durch Leerzeichen getrennte Teil als Argument behandelt.

(Ich habe zu geändert $PATH, $pathweil $PATHes sich um eine wichtige reservierte Variable handelt und Sie sie nicht für allgemeine Zwecke verwenden dürfen.)

Matteo
quelle
1
Perfekt! Vielen Dank an eine Million @Matteo. Es stellte sich heraus, dass es auch ein vorangestelltes Leerzeichen gab, in das auch ein Schraubenschlüssel geworfen wurde.
Miles Alden
1

Ich habe mit ssh etwas sehr Ähnliches versucht und eine Befehlszeile durchlaufen. z.B

ssh <somehost> ls -l "$PATH"

Ich fand, dass das einfache Definieren von "$ PATH" nicht den Trick machte - es warf immer noch Fehler auf. Allerdings, wenn ich rannte

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

Das hat funktioniert. Der Trick besteht darin, sicherzustellen, dass ein zusätzlicher Satz von "" von der Shell an den Befehl ssh übergeben wird.

Roland Ward
quelle