Сначала я опишу проблему. Я часто копирую файлы с рабочего стола Linux на свой Android-планшет. По причинам, которые я бы предпочел не делать, самым простым способом, который я нашел для этого, является запуск sshDroid (ssh-сервера) на моем планшете и использование scp
из оболочки для копирования файлов. Команда scp
принимает следующий вид:Функция Escaping to bash
scp -P 2222 ./some\ document\:\ with\ subtitle\ -\ author.txt \
[email protected]:/sdcard/uploads
Единственное, что изменения в этом выражении является имя файла, и это довольно легко достигается с помощью вкладки-завершения. Даже IP-адрес не меняется. Поскольку я загружаю файлы довольно часто, мне очень хотелось бы не вводить одни и те же символы снова и снова. Для этого я решил написать функцию оболочки и добавить ее в .bashrc
. Функция я написал следующим образом:
upload(){ scp -P 2222 [email protected] [email protected]:/sdcard/uploads; }
это использование должно быть:
upload ./some\ document\:\ with\ subtitle\ -\ author.txt
, но когда я пытаюсь его я получаю следующий результат:
SSHDroid
Use 'root' as username
Default password is 'admin'
[email protected]'s password:
./some: No such file or directory
ssh: Could not resolve hostname document: Name or service not known
with: No such file or directory
subtitle: No such file or directory
-: No such file or directory
author.txt: No such file or directory
Это выглядит bash автоматически отменяет имя файла перед тем, как передать его функции, а команда scp рассматривает его как несколько имен файлов из-за пробелов в имени.
Мой вопрос: Как сохранить обратную косую черту в параметре или не получится, как это сделать? После того, как я некоторое время спотыкался об этом, у меня возникло соблазн написать простой скрипт python и поместить его в/usr/local/bin. Есть ли какое-то другое bash-native решение, которое мне не хватает?
Это не «неувязка», это проблема, это расщепление строк. Unescaping всегда происходит в начале процесса синтаксического анализа, но он должен ... это функция, а не ошибка. Проблема заключается в том, что когда ваш неограниченный контент затем получает разделение по строкам или глобус, расширенное, потому что оно не было правильно указано. См. Http://mywiki.wooledge.org/BashParser –
Кстати, если ваша цель - хорошее понимание модели исполнения [и страница BashParser все еще оставляет вас менее уверенной], BashFAQ # 50 затрагивает те же темы, что недопонимание этого вопроса; см. http://mywiki.wooledge.org/BashFAQ/050 –