2016-06-21 2 views
0

Сначала я опишу проблему. Я часто копирую файлы с рабочего стола 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 решение, которое мне не хватает?

+0

Это не «неувязка», это проблема, это расщепление строк. Unescaping всегда происходит в начале процесса синтаксического анализа, но он должен ... это функция, а не ошибка. Проблема заключается в том, что когда ваш неограниченный контент затем получает разделение по строкам или глобус, расширенное, потому что оно не было правильно указано. См. Http://mywiki.wooledge.org/BashParser –

+0

Кстати, если ваша цель - хорошее понимание модели исполнения [и страница BashParser все еще оставляет вас менее уверенной], BashFAQ # 50 затрагивает те же темы, что недопонимание этого вопроса; см. http://mywiki.wooledge.org/BashFAQ/050 –

ответ

2

Цитаты!

Несущаясь, [email protected] ведет себя одинаково с $*; если вы хотите сохранить оригинальную токенизацию, вместо этого вам нужно использовать "[email protected]". Таким образом:

upload() { scp -P 2222 "[email protected]" [email protected]:/sdcard/uploads; } 
+0

Это работает! Спасибо за ответ и подробные ссылки. –