适用于 Windows 的 GNU Emacs 仅忽略脚本的 PATH

问题描述

我喜欢在 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 命令一起使用时,

  1. $USERPROFILE/Documents/bin/sql-client.pl 工作正常
  2. 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 groovychmod 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 运行程序。