问题描述
我喜欢在 Windows 10 上将 cygwin bash 与 GNU Emacs 的 FSF 端口(不要与 GNU Emacs 的 cygwin 端口混淆)。我的 .emacs 将 shell-file-name 定义为 cygwin bash。当我使用 emacs compile 命令或 emacs asynch shell 命令与我的 PATH 环境变量中的可执行文件时,没有问题。
但是,当我将自己的 sql-client.pl 脚本与 compile 命令一起使用时,
-
$USERPROFILE/Documents/bin/sql-client.pl
工作正常 -
sql-client.pl
(注意没有目录路径)给我错误Can't open perl script "/cygdrive/c/Users/shein/Documents/bin/sql-client.pl": No such file or directory
即使 bin 目录在我的路径中。显然,cygwin bash 找到了它,但不会执行它!
但是,在 eval 提示符下,以下 lisp 代码可以正常工作:
(with-current-buffer (get-buffer-create "*scratch*") (call-process *bash* nil (current-buffer) nil "-c" "sql-client.pl"))
(请注意,它会在 PATH 中找到 sql-client.pl,而我不必指定脚本的路径)。
我用 groovy(一个 bash 脚本)命令得到了类似的结果:如果我在 compile 命令中指定完整路径,它就可以工作。如果我使用 elisp 的“调用进程”函数,它就可以工作。但是,它不能(不)从没有路径的编译命令中执行它。它找到了它,但是,像 sql-client.pl 一样,cygwin bash 不会执行它。
使用 cygwin chmod u+x groovy
或 chmod u+x sql-client.pl
命令没有帮助。
但是如果我使用 groovy.bat 而不是 groovy 并且不指定路径,它就可以工作!
或者,如果我使用控制台 bash 提示符,一切正常。
这是 emacs 或 cywgin bash 中的错误吗?一种解决方法是始终为我的脚本指定一个路径,但这可能很麻烦...还有其他更好的解决方法吗?
谢谢
齐格弗里德
解决方法
由于您没有使用 Emacs 的 Cygwin 端口,除非您明确说明,否则我不明白为什么 Emacs 应该调用 bash。假设您还安装了 Perl 的 Windows 端口(例如 Active State Perl),我将通过 perl -x sql-client.pl
显式调用您的脚本。
还要注意,Cygwin 模拟的可执行权限无论如何在 Windows 世界中都没有多大意义,所以我想它们无论如何都无关紧要,除非您通过某个 Cygwin shell 运行程序。