Ryan C. Thompson
Ryan C. Thompson

Reputation: 42090

How to capture standard output of a shell command in elisp?

I want to run a shell command within Emacs and capture the full output to a variable. Is there a way to do this? For example, I would like to be able to set hello-string to "hello" in the following manner:

(setq hello-string (capture-stdout-of-shell-command "/bin/echo hello"))

Does the function capture-stdout-of-shell-command exist, and if so what is its real name?

Upvotes: 52

Views: 18658

Answers (3)

uanr81
uanr81

Reputation: 409

Finally, the "git log" "--reverse" option came in handy ). Open a buffer with the current buffer file as of the most initial commit.

(vc-revision-other-window (car (process-lines "git" "log" "--format=%h" "--reverse")))

And on the question of

(setq hello-string (car (process-lines "echo" "hello")))

Upvotes: 1

Ise Wisteria
Ise Wisteria

Reputation: 11669

Does shell-command-to-string meet your purpose?

For example:

(shell-command-to-string "/bin/echo hello")

Upvotes: 84

Chris McMahan
Chris McMahan

Reputation: 2690

I have a suggestion to made that extends Ise Wisteria's answer. Try using something like this:

(setq my_shell_output
  (substring 
    (shell-command-to-string "/bin/echo hello") 
   0 -1))

This should set the string "hello" as the value of my_shell_output, but cleanly. Using (substring) eliminates the trailing \n that tends to occur when emacs calls out to a shell command. It bothers me in emacs running on Windows, and probably occurs on other platforms as well.

Upvotes: 29

Related Questions