Проблема в скрипте с пробелами в имени файла


11

У меня есть скрипт, который scp это файл с удаленного хоста обратно на локальный. Иногда имена файлов содержат пробелы. scp не любит пробелы в именах файлов. По некоторым причинам мои попытки обработки пробелов не привели к правильному пути scp.

Код:

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

Результаты в

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

Заключение PATH в кавычки "$PATH"дает ту же ошибку.

Обмен пробелами на пробелы также не работает, хотя, насколько я могу судить, следует:

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

хотя печать экранированного пути показывает, что редактирование работало:

echo $ESC_PATH
> /var/root/Documents/MyFile\ OG-v1.2.3.pkg

4
Пожалуйста, не используйте $PATHдля своих собственных переменных, потому что это нужно вашему терминалу.
Бернхард

Ответы:


19

Вы должны указать как декларацию, так и использование

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

Если вы не цитируете первое, $pathбудет содержаться только первая часть. Если вы не заключите в кавычки второе, scpкаждая разделенная пробелами часть будет рассматриваться как аргумент.

(Я изменил $PATHна, $pathпотому что $PATHэто важная зарезервированная переменная, и вы не должны использовать ее для общих целей.)


1
Отлично! Спасибо миллион @Matteo. Оказывается, там было также префиксное пространство, в которое также был добавлен гаечный ключ.
Майлз Олден

1

Я пробовал что-то очень похожее с ssh и передавал через него командную строку. например

ssh <somehost> ls -l "$PATH"

Я обнаружил, что простое определение «$ PATH» не сработало - оно все равно приводило к ошибкам. Однако если я побежал

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

Это сработало. Хитрость заключается в том, чтобы дополнительный набор «» передавался команде ssh из оболочки.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.