Какая командная оболочка в emacs lisp?

Если я пытаюсь запустить команду оболочки в Emacs Lisp, в которой я вызываю rsync (или scp) несколько раз, какой вариант командной оболочки использовать? В настоящее время я использую shell-command, который блокирует Emacs до тех пор, пока процесс не будет выполнен, и вывод, который должен быть видимым с --verbose до rsync, не печатается; Я могу использовать shell-command с & в конце командной строки, чтобы сделать его асинхронным, что печатает прогресс, но, хотя он не полностью блокирует Emacs, минибуфер повторно спрашивает, хочу ли я убить процесс, который вредит тем временем; и start-process-shell-command, который, как представляется, останавливает функцию только после переноса первого файла/каталога; игнорируя остальные, когда есть несколько вызовов rsync, выполненных через мою функцию. Ни один из них не кажется идеальным, любые подсказки?

Ответ 1

У меня был наибольший успех, используя сам процесс запуска.

(start-process "process-name" 
               (get-buffer-create "*rsync-buffer*") 
               "/path/to/rsync"
               arg1
               ...
               argn)

Это отправит весь вывод в один буфер.

Ответ 2

Одним из решений может быть запуск команды в фактическом shell-буфере. Затем вы можете выбрать, какой из них запустить:

M-x shell
M-x eshell
M-x term

Если вам нравится эта идея, вы можете ее скопировать следующим образом:

(defun my-rsync-routine ()
  "run some rsync processes"
  (with-temp-buffer
    (shell (current-buffer))
    (process-send-string nil "rsync ...")
    (process-send-string nil "rsync ...")
    (process-send-string nil "rsync ...")))

Подробнее о 'process-send-string для его использования. Возможно, вы также захотите провести проверку ошибок на output из процессов.