【问题标题】:GNU Emacs for Windows ignores PATH for scripts onlyGNU Emacs for Windows 仅忽略脚本的 PATH
【发布时间】:2021-03-16 22:03:05
【问题描述】:

我喜欢在 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 脚本和编译命令时,

  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 中的错误吗?一种解决方法是始终为我的脚本指定一个路径,但这可能很麻烦......有没有人有另一个更好的解决方法?

谢谢

齐格飞

【问题讨论】:

    标签: windows bash emacs cygwin


    【解决方案1】:

    由于您没有使用 Emacs 的 Cygwin 端口,除非您明确说明,否则我不明白为什么 Emacs 应该调用 bash。假设您还安装了 Perl 的 Windows 端口(例如 Active State Perl),我将通过 perl -x sql-client.pl 显式调用您的脚本。

    还要注意,Cygwin 模拟的可执行权限无论如何在 Windows 世界中没有多大意义,所以我想它们无论如何都无关紧要,除非你通过一些 Cygwin shell 运行程序。

    【讨论】:

    • 我使用 Active State 或 Strawberry 或 Cygwin perl,具体取决于脚本(在此示例中,我需要使用 32 位草莓 perl,因为我正在操作 32 位 MS Access 数据库)。我使用 bash she-bang 语法为该脚本调用正确的 perl。 Strawberry perl 故意不在我的 PATH 中。所以明确指定适当 perl 的完整路径是一种负担......还有其他想法吗?
    • 哦,是的 -- emacs 编译命令调用 cygwin bash,因为我在 .emacs 中设置了 shell-file-name ... 我的 windows Emacs 编译命令也可以调用 windows powershell 或 linux powershell 或 ubuntu bash也通过 WSL2...
    • @user3477493 :明确的perl -x ... 工作吗?
    • @user3477493 :您说您可以通过这种方式调用 Ubuntu bash。我发现您尝试并行运行两个非常不同的“bash-worlds”(WSL,Cygwin)令人困惑。您可以使用 Cygwin bash 直接调用 bash 脚本(即不依赖 Ubuntu)吗?如果是这种情况,我会编写一个 bash 包装脚本,它只调用你的sql-client.pl。即使它仍然无法运行它,我们至少有一个定义良好的环境,我们可以调试它。
    • 是的,我可以在没有 ubuntu bash 的情况下直接在 cygwin bash 中调用 perl 和 bash 脚本,反之亦然。但正如我最初提到的那样,我在使用 cygwin bash 脚本(例如调用 groovy 解释器/编译器的 bash“groovy”脚本)时遇到了与 perl 脚本相同的问题:emacs compile 命令通过使用$PATH 然后不会执行它们。正如我上面解释的,当我使用 emacs elisp call-process 函数时,它正确地使用 $PATH 找到了 bash 脚本并成功执行(调用)了该脚本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    • 2014-09-13
    相关资源
    最近更新 更多