我有一个包含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命令有什么用呢?
感谢。
答案 0 :(得分:3)
当你输入任何命令时,你正在替换它的标准输入。你输入while ... done
,emacs
是该命令的一部分,因此它的标准输入就是管道。
我想可以巧妙地使用重定向来“保存”和“恢复”stdin,但我还没有提出它。或者,你可以eval $cmd </dev/tty
。
答案 1 :(得分:1)
Emacs需要一个tty才能以-nw模式运行你的猫read循环使用cat的输出作为所有子命令的标准输入,这不是tty。最好的做法是将所有/ tmp / cmd行加载到一个行数组中,然后遍历数组以运行每个命令(但这也可能因引用问题而变得棘手)。