trouble starting emacs -nw by reading command from a file
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 开发者_如何学Cother 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
, and emacs
is 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
.
Emacs needs a tty to run in -nw mode your cat | while read loop is using the output of cat as a standard input for all child commands and this is not a tty. The best thing to do would be to load all of your /tmp/cmd lines into an array of lines and then loop over the array to run each command (but this also might get tricky with quoting issues).
精彩评论