#emacs #elisp
#emacs #elisp
Вопрос:
Поскольку точка с запятой является разделителем комментариев в elisp
, существует ли альтернативный метод для включения аргумента командной строки (содержащего точку с запятой) в elisp
функцию? Командная строка отлично работает в терминале, но я в недоумении относительно того, как использовать ее как часть функции, содержащей start-process
оператор — Emacs не распознает закрывающие круглые скобки / кавычки после точки с запятой, и Emacs, естественно, жалуется при загрузке.
ssh user@server -t "cd /some/directory; bash --login"
Вот ссылка на связанный поток, который предоставил рабочую командную строку: https://superuser.com/a/250538/206164
Вот аргумент командной строки, который в конечном итоге будет включен в функцию, содержащую start-process
. Из всех вариантов, которые я пробовал сегодня днем / вечером, следующая командная строка — единственная, которая успешно работает в терминале для входа в iphone и перехода к определенному каталогу одним махом — т. Е. username@server.name:/path/
Не работает на iphone. Когда все будет запущено и запущено, процесс запуска будет использоваться совместно с rsync
для односторонней синхронизации.
/Users/HOME/.0.data/.0.emacs/elpa/bin/sshpass -p 'alpine' ssh -p '2222' -l root localhost -t "cd /var/mobile/Applications/F30B1574-5979-4764-8742-7F9DB2863094/Documents/.0.data; bash --login"
Комментарии:
1. Как выглядит ваш вызов
start-process
? Вы уверены, что не оставили некоторые двойные кавычки без экранирования внутри строки?2. @phils — Функция запуска процесса, которая должна включать rsync, еще не работает, но вот черновик:
(start-process "rsync-process" "*rsync*" "/usr/bin/rsync" "--dry-run" "--delete" "-arzh" "/Users/HOME/.0.data/" "--rsh="/Users/HOME/.0.data/.0.emacs/elpa/bin/sshpass -p 'alpine' ssh -p '2222' -l root localhost"" "-t" "cd /var/mobile/Applications/F30B1574-5979-4764-8742-7F9DB2863094/Documents/.0.data amp;amp; bash --login")
3. Передаются ли последние два аргумента в ssh или в rsync? В любом случае, если я изменю ваш
amp;amp;
на;
, я не вижу никаких проблем с Emacs, считывающим общее выражение. (Я запускаю магистраль Emacs с 2014-05-03.)4. @phils @ Хммм … вы правы — теперь он работает с точкой с запятой. Должно быть, я допустил ошибку раньше с одним или несколькими кавычками; однако я не сохранил старый черновик. Что касается rsync, я действительно понятия не имею, как заставить его работать — он отлично работает с двумя локальными каталогами — в Google я не смог найти примеров, которые имели бы дело с удаленной целью через ssh, только с удаленным источником. Простая версия выглядит так из командной строки:
/usr/bin/rsync --dry-run --delete -arvzh --progress /Users/HOME/.0.data/ /Volumes/DATA/OFFICE/06_28_2014
5. Я бы не подумал, что ssh имеет значение. Вы хотите сказать, что можете успешно выполнить передачу в одном направлении, но не в другом?
Ответ №1:
Я удивлен, что это не работает как есть, поскольку строки Emacs, безусловно, могут содержать точки с запятой, но если это вызывает проблемы, вы должны иметь возможность изменить команду для использования amp;amp;
вместо ;
:
ssh user@server -t "cd /some/directory amp;amp; bash --login"
Эта команда будет выполняться только bash --login
в случае cd
успешного завершения, о чем свидетельствует возвращаемое значение 0. Я полагаю, что это ваше намерение.
Подробности см. в документации Bash по спискам команд. (Все другие оболочки, отличные от Windows, с которыми я знаком, также поддерживают этот синтаксис).
Комментарии:
1. Обратите внимание, что вы никогда не должны использовать точку с запятой для объединения команд в цепочку, если не хотите , чтобы последующие команды все еще выполнялись, если предыдущая не удалась. В большинстве ситуаций желательно, чтобы ошибка прерывала всю последовательность, поэтому вам следует привыкнуть использовать
amp;amp;
по умолчанию.