无法 运行 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 了解有关不同类型的启动脚本的更多详细信息。
我有一个 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 了解有关不同类型的启动脚本的更多详细信息。