2011-09-09 87 views
1

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

考虑以下情况:

>> 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命令怎么了?

谢谢。

回答

3

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

我想,会有一些聪明的使用重定向,通过它可以'保存'和'恢复'标准输入,但我还没有拿出它。或者,你可以eval $cmd </dev/tty

+0

eval $ cmd Jer

+0

另外值得注意的是'ls'不必使用stdin,所以不会显示问题。 –

1

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

相关问题