开发者

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

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜