无法 运行 WSL bash 批处理文件中的 Homebrew 应用程序(未找到命令)

Can't run a Homebrew app from batch file in WSL bash (command not found)

我有一个 bash 脚本,其中包含以下命令,包括将文件传递给 eyeD3, which I installed using Homebrew:

#!/usr/bin/env bash
cd /mnt/c/Users/charl/Downloads;
eyeD3 test.mp3;

当我从 Ubuntu bash 提示符 Windows 子系统 Linux (WSL) 中 运行 时,我得到了正确的结果:

thompcha@WINDOWS-79UTJUF:/mnt/c/Users/charl/Documents/Scripts$ ./eyed3.sh
/mnt/c/Users/charl/Downloads/test.mp3                                                     [ 7.15 MB ]
-----------------------------------------------------------------------------------------------------
Time: 04:26     MPEG1, Layer III        [ 224 kb/s @ 44100 Hz - Stereo ]
-----------------------------------------------------------------------------------------------------
ID3 v2.4:
title: Example Song
artist: Example Artist
album: Example Album
track: 1
-----------------------------------------------------------------------------------------------------

但是,如果我 运行 来自像这样的批处理文件的 bash 脚本,

@ECHO OFF
bash.exe -c ./eyed3.sh
PAUSE

eyeD3命令不能运行:

./eyed3.sh: line 3: eyeD3: command not found
Press any key to continue . . .

ls这样的默认系统命令可以通过批处理文件调用的shell脚本以这种方式运行,但eyeD3不能。我猜脚本在 运行 这样的情况下无法“看到”环境 $PATH,但我不确定该怎么做。

我在 cmd.exe 属性中取消选中“使用旧版控制台”。

如何在批处理文件的 shell 脚本中 运行 自制软件命令?

简答 - 多个选项:

  • 选项 1:将其更改为 bash.exe -l -c ./eyed3.sh。我相当确定这会起作用(请参阅下面的“原因”)。
  • 选项 2:根据评论,在其运行的终端中使用 which eyeD3 识别 eyeD3 可执行文件的位置,然后在 shell 脚本中对完全限定路径进行硬编码。
  • 选项 3:在 .bashrc 中设置 Homebrew 路径,而不是 .profile(Homebrew 设置它的地方)。

/aside:哇,我用eyeD3已经15年多了。令人惊奇的是,它仍然存在并且还在运行!

发生了什么事

我不 运行 Homebrew,但查看它的 install script(最后 10 行左右)证实了我的直觉,它将它的路径添加到你的 .profile(或其他适用的启动脚本)在安装过程中。

.profile(或 .bash_profile 或 ...)仅用于登录 shells(通常是产生其他非登录的“顶级”shell登录 shells)。这是登录时只应该“一次”完成的事情的地方,而不是在每个 shell 实例中。这里设置PATH是因为导出到subshells,所以不用每次都设置

所以当你 运行 bash.exe -c ./eyeD3.sh,那实际上是一个非登录 shell,它会跳过登录启动脚本,从而跳过 Homebrew 添加的修改代码小路。 运行 bash-l 参数将导致它 运行 作为登录名 shell,从而获取该 Homebrew 代码,并修改该 shell.

如果您有兴趣,请参阅 this answer 了解有关不同类型的启动脚本的更多详细信息。