我想在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
非常感谢任何帮助。
答案 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
将与其他任何内容一样。