Вы написали
I further open two terminal sessions for each of the users respectively
А потом в комментарии вы уточнили, что после открытия нового окна терминала
I then use "su - username" to log in to the other user
При открытии окна терминала создается запись в utmp
. Команда su
этого не делает. Таким образом, каждое открытое вами окно будет зарегистрировано под вашей исходной учетной записью пользователя, которая вошла в систему.
Ваш шаблон побега не совсем правильный. Вместо этого используйте это, которое предваряет каждое появление пробела одной обратной косой чертой:
ESC_DB_ARC_FILENAME="${DB_ARC_FILENAME// /\\ }"
Тестовый сценарий (в$HOME
):
file='the date.txt'
date > "$file"
scp -vp localhost:"$file" td; ls -l td; rm -f td # Fails
scp -vp localhost:"${file// /\\ }" td; ls -l td; rm -f td # Succeeds
Понятно. Это сообщение об ошибке выдает:
: No such file or directoryes/SONIC BOATS LTD./database-1.11-2019-12-30-09-40.zip
Вы используете исходный файл данных, созданный на компьютере с Windows. Завершающий CR рассматривается как часть имени файла, и, конечно же, в исходном файле такого символа нет.
Я столкнулся с похожими проблемами при попытке скопировать файлы с удаленных путей, содержащих пробелы, с помощью scp
из сценария Bash.
Вот решения, которые я придумал:
Использование двойных -кавычек + опция-T
:
scp -T user@host:"'<path-with-spaces>'" <destination>
scp -T user@host:'"<path-with-spaces>"' <destination>
scp -T user@host:"\"<path-with-spaces>\"" <destination>
Обратите внимание, :без опции -T
, эти команды приведут к protocol error: filename does not match request
. Причина этого подробно обсуждается здесь .
Путь выхода с помощью printf:
source="<path-with-spaces>"
printf -v source "%q" "${source}"
scp user@host:"${source}" <destination>
Обратите внимание, :это прекрасно работает без опции -T
, но только для одного файла. Для нескольких файлов снова требуется опция -T
(та же ошибка, что и выше ).