在Emacs-lisp中,在ls命令中使用call-process的正确方法是什么?

时间:2011-02-01 04:43:36

标签: emacs lisp

我想在emacs-lisp中执行以下shell命令:

ls -t ~/org *.txt | head -5

我尝试以下内容:

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

结果

ls: ~/org: No such file or directory
ls: *.txt: No such file or directory
ls: |head -5: No such file or directory

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:17)

问题是~程序不会处理/扩展*|ls等令牌。由于未处理令牌,ls将查找字面上称为~/org的文件或目录,字面上称为*.txt的文件或目录,以及字面上称为{{1}的文件或目录}}。因此,您收到的有关“没有此类文件或目录”的错误消息。

这些令牌由shell处理/扩展(如Bourne shell / bin / sh或Bash / bin / bash)。从技术上讲,令牌的解释可以是特定于shell的,但是大多数shell以相同的方式解释至少一些相同的标准令牌,例如, | head -5意味着将程序端到端地连接到几乎所有的shell。作为一个反例,Bourne shell(/ bin / sh)不会进行|代字号/主目录扩展。

如果你想获得扩展,你必须让你的调用程序像shell一样进行扩展(努力工作)或在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扩展。

答案 1 :(得分:12)

根据您的使用情况,如果您发现自己想要执行shell命令并且经常在新缓冲区中提供输出,您还可以使用shell-command功能。在您的示例中,它看起来像这样:

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

要将此插入当前缓冲区,需要使用current-prefix-arg等手动设置(universal-argument),这有点像黑客攻击。另一方面,如果您只想在某个地方输出输出并进行处理,shell-command将与其他任何内容一样。