如何从特定目录执行shell命令(例如git gui
)?我更喜欢不依赖于&&
或;
等shell运算符的跨平台方法,因为我需要在Windows和unix上运行它。 (例如,调用cd /path/to/dir && git gui
将无法在Windows上运行,因为&&
无效。)
我试过了:
(async-shell-command (concat "cd \""
(replace-regexp-in-string
"/" "\\\\" (file-name-directory (buffer-file-name))) "\" ; git gui"))
失败是因为无论出于何种原因,shell认为; git gui
是路径的一部分,并且报告:The system cannot find the path specified.
所以,我宁愿不处理shell怪癖,我希望有一个elisp函数来设置shell-command
或async-shell-command
的目录。我试过了:
(shell-process-pushd (file-name-directory (buffer-file-name)))
(shell-command "git gui")
(shell-process-popd nil)
这没有效果:git gui
总是在我的主目录中打开。 (另外,shell-process-pushd/popd
没有记录。)
这也不起作用:
(start-process "gitgui" nil "git" "gui")
这两个都没有:
(let '(bufdir (file-name-directory (buffer-file-name)))
(with-temp-buffer
(print bufdir)
(cd bufdir)
(shell-command "git gui")))
答案 0 :(得分:7)
您确定在emacs-lisp中使用尾部斜杠表示目录名吗?
(let ((default-directory "~/.emacs.d"))
(shell-command-to-string "echo $PWD"))
;;; ⇒ "/Users/me"
(let ((default-directory "~/.emacs.d/"))
(shell-command-to-string "echo $PWD"))
;;; ⇒ "/Users/me/.emacs.d"
答案 1 :(得分:2)
试试这个:
(let ((default-directory "~/.emacs.d/")) (shell-command "ls"))
答案 2 :(得分:1)
(shell-command)
使用缓冲区default-directory
,这意味着没有理由cd
到缓冲区的目录。
我的问题是我错误地在没有关联git gui
目录的缓冲区上运行.git/
。