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



我有一个包含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并将其管道到less的方式)。

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

这是预期的工作,所以我不认为有引号/空格的问题。这样就剩下了连字符,但如果我这样做,比如"ls -alh",也可以。

那么emacs命令是怎么回事?

谢谢。

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

我想象会有一些巧妙的使用重定向,通过它你可以"保存"one_answers"恢复"stdin,但我还没有想到。或者eval $cmd </dev/tty

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

最新更新