通过从文件中读取命令来启动emacs -nw时出现问题

时间:2011-09-09 16:50:14

标签: bash emacs eval

我有一个包含bash命令的文件,我逐个阅读它们并调用eval来运行它们。这工作正常,直到我尝试运行“emacs -nw”。我已将问题简化为以下情况。任何人都可以解释为什么emacs命令不起作用以及如何解决它?我怀疑它有引号和/或连字符的东西,但无法弄清楚问题,其他带空格的命令工作正常。

考虑以下情况:

>> cmd="emacs -nw"; echo $cmd; eval $cmd;

这可以按预期工作。 Emacs在当前shell中打开。

>> cmd="ls /tmp"; echo $cmd; eval $cmd;

这可以按预期工作。我看到了/ tmp。

的内容
>> echo "emacs -nw" > /tmp/cmds; cat /tmp/cmds | 
   while read cmd; do echo $cmd; eval $cmd; done

这不起作用。我得到“emacs:标准输入不是tty”,好像我试图将输入管道输入到emacs -nw(例如,你将grep和管道输入更少的方式)。

>> echo "ls /tmp" > /tmp/cmds; cat /tmp/cmds | 
   while read cmd; do echo $cmd; eval $cmd; done

这可以按预期工作,所以我认为引用/空格没有问题。这留下了连字符,但如果我这样做,比如说“ls -alh”,那也可以。

那么emacs命令有什么用呢?

感谢。

2 个答案:

答案 0 :(得分:3)

当你输入任何命令时,你正在替换它的标准输入。你输入while ... doneemacs是该命令的一部分,因此它的标准输入就是管道。

我想可以巧妙地使用重定向来“保存”和“恢复”stdin,但我还没有提出它。或者,你可以eval $cmd </dev/tty

答案 1 :(得分:1)

Emacs需要一个tty才能以-nw模式运行你的猫read循环使用cat的输出作为所有子命令的标准输入,这不是tty。最好的做法是将所有/ tmp / cmd行加载到一个行数组中,然后遍历数组以运行每个命令(但这也可能因引用问题而变得棘手)。