11

If I am trying to run a shell-command in an Emacs Lisp function in which I call rsync (or scp) multiple times, which shell-command variant should I use? I am currently using shell-command, which locks up Emacs until the process is done, and the output that should be visible with the --verbose to rsync is not printed; I can use shell-command with an & at the end of the command string to make it asynchronous, which does print the progress — but while it doesn't "lock up" Emacs entirely, the minibuffer repeatedly asks if I want to kill the process which is crippling in the meantime; and start-process-shell-command, which appears to halt the function only after the first file/directory is transferred; neglecting the rest when there are multiple rsync calls made through my function. None of these seem ideal, any hints?

1

2 Answers 2

13

I have had the most success using start-process myself.

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

This will send all the output to a single buffer.

Sign up to request clarification or add additional context in comments.

Comments

5

One solution might be to run the command in an actual shell buffer. Then you get to choose which one of those to run:

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

If you like that idea, you can code it up like this:

(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 ...")))

Read more on 'process-send-string for its usage. You might also want to have some error checking on the output from the processes.

1 Comment

Hello Trey, thank you always. This time I had to choose with Jonathan's solution but as it was direct and well-suited for this purpose (and process-send-string seemed to work only in a buffer created and explicitly referenced (with get-buffer-create) rather than in temp-buffer...) but I am reading up on the filtering functions... there is much to grok and I am sure I will find uses at the end of it. Thank you again.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.