Problemy ze skryptem ze spacjami w nazwie pliku

11

Mam skrypt, który scp jest plikiem ze zdalnego hosta z powrotem na lokalny. Czasami nazwy plików zawierają spacje. scp nie lubi spacji w nazwach plików. Z jakiegoś powodu moje próby obsługi spacji nie doprowadziły do ​​prawidłowej ścieżki scp.

Kod:

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

Prowadzi do

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

Zawarcie PATH w cudzysłowie "$PATH"daje ten sam błąd.

Zamiana spacji na spacje również nie działa, chociaż o ile mogę powiedzieć, powinna:

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

chociaż wydrukowanie ścieżki zmiany znaczenia pokazuje, że edycja działała:

echo $ESC_PATH
> /var/root/Documents/MyFile\ OG-v1.2.3.pkg
Miles Alden
źródło
4
Nie używaj $PATHdo własnych zmiennych, ponieważ twój terminal tego potrzebuje.
Bernhard

Odpowiedzi:

19

Powinieneś podać zarówno deklarację, jak i sposób użycia

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

Jeśli nie zacytujesz pierwszej, $pathbędzie zawierać tylko pierwszą część. Jeśli nie zacytujesz drugiego, scppotraktuje każdą część oddzieloną spacją jako argument.

(Zmieniłem $PATHna, $pathponieważ $PATHjest to ważna zmienna zastrzeżona i nie wolno jej używać do celów ogólnych).

Matteo
źródło
1
Doskonały! Dziękuję milion @ Matteo. Okazuje się, że wrzucono do niej również klucz z ustalonym wcześniej miejscem.
Miles Alden,
1

Próbowałem czegoś bardzo podobnego z ssh i przepuściłem przez to linię poleceń. na przykład

ssh <somehost> ls -l "$PATH"

Przekonałem się, że samo zdefiniowanie „$ PATH” nie załatwiło sprawy - wciąż powodowało błędy. Jednak gdybym pobiegł

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

To zadziałało. Sztuczka polega na tym, aby dodatkowy zestaw „” został przekazany do polecenia ssh z powłoki.

Roland Ward
źródło