I have a file containing bash commands, and I read them one by one and call eval to run them. This was working fine until I try to run “emacs -nw”. I’ve simplified the problem to the following cases. Can anyone explain why the emacs commands don’t work and how to fix it? I suspect it has something with quotes and/or the hyphen but can’t figure out the problem, and other commands with spaces in them work fine.
Consider these cases:
>> cmd="emacs -nw"; echo $cmd; eval $cmd;
This works as expected. Emacs is opened within the current shell.
>> cmd="ls /tmp"; echo $cmd; eval $cmd;
This works as expected. I see the contents of /tmp.
>> echo "emacs -nw" > /tmp/cmds; cat /tmp/cmds |
while read cmd; do echo $cmd; eval $cmd; done
This does not work. I get “emacs: standard input is not a tty”, as if I was trying to pipe input to emacs -nw (the way you’d grep and pipe it to less, for example).
>> echo "ls /tmp" > /tmp/cmds; cat /tmp/cmds |
while read cmd; do echo $cmd; eval $cmd; done
This works as expected, so I don’t think there’s a problem with the quoting/spaces. That leaves the hyphen, but if I do, say, “ls -alh”, that works fine too.
So what’s up with the emacs command?
Thanks.
When you pipe into any command, you’re replacing its standard input. You’re piping into
while ... done, andemacsis part of that command, and so its standard input is the pipe.I imagine that there would be some clever use of redirection by which you could ‘save’ and ‘restore’ stdin, but I haven’t come up with it. Or, you could
eval $cmd </dev/tty.