2011-02-01 101 views

回答

16

问题是像~,*|这样的标记不会被ls程序处理/扩展。由于令牌没有被处理,因此ls正在寻找名为~/org的文件或目录,字面上被称为*.txt的文件或目录以及字面上被称为| head -5的文件或目录。因此,您收到的有关“没有这样的文件或目录”的错误消息:

这些令牌由shell处理/扩展(例如Bourne shell/bin/sh或Bash/bin/bash)。从技术上讲, Bourne shell(/ bin/sh)可以是特定于shell的,但大多数shell至少会以相同的方式解释相同的标准标记,例如|意味着将程序连接到几乎所有的shell。作为反例,Bourne shell不要做~ tilde/home-directory扩展

如果你想获得扩展,你必须让你的调用程序做一个像shell一样的扩展(努力工作),或者运行你的ls命令外壳(更容易):

/bin/bash -c "ls -t ~/org *.txt | head -5" 

所以

(call-process "/bin/bash" nil t nil "-c" "ls -t ~/org *.txt | head -5") 

编辑:澄清了一些问题,如提的是,/bin/sh不做~扩张。

+0

完美答案。谢谢! – eatloaf 2011-02-03 16:23:20

+0

@eatload - gald能够提供帮助 - R. P. Dillon的`shell-command`似乎也是一个很好的选择。 – 2011-02-03 16:34:28

11

根据您的使用情况,如果您发现自己希望执行shell命令并使输出经常在新缓冲区中可用,则还可以使用shell-command功能。在你的榜样,它会是这个样子:

(shell-command "ls -t ~/org *.txt | head -5") 

为了促成插入到当前缓冲区,不过,将要求您手动设置current-prefix-arg使用类似(universal-argument),这是一个黑客攻击的一位。另一方面,如果你只是想要输出到某个地方,你可以得到它并处理它,shell-command可以和其他任何东西一样工作。

相关问题