【发布时间】:2021-12-05 07:14:14
【问题描述】:
我正在开发一个在 Linux 环境和 Windows 环境中执行的Makefile(通过MINGW64)。该脚本有一个变量指向应该使用的 shell 命令:
SHELL:=/usr/bin/env bash
稍后,该变量将被用于运行 shell 脚本:
${SHELL} ./utils/tests.sh
在 Linux 上可以正常工作,但在带有 MINGW64 (Git Bash) 的 Windows 上它会失败,因为 /usr/bin/env 被替换为 C:/Program Files/Git/usr/local 并且“程序文件”中有一个空格字符会破坏 Makefile 中的路径。
为了解决 Windows 上的问题,我可以将 ${SHELL} 放在引号中以确保保留空格字符:
"${SHELL}" ./utils/tests.sh
但是,这在 Linux 环境中会出现问题,因为它现在变成了一个字符串,并且 "/usr/bin/env bash" 不可执行。
所以我想出了这个解决方案:
ifeq ($(OS),Windows_NT)
"${SHELL}" ./utils/tests.sh
else
${SHELL} ./utils/tests.sh
endif
现在这两种环境(Linux 和 MINGW64)都可以使用,但它的缺点是在我想运行脚本的任何地方都有 5 行代码。理想情况下,我只想分配一次变量。我试过了,但它也不起作用:
ifeq ($(OS),Windows_NT)
SHELL:="/usr/bin/env" bash
else
SHELL:=/usr/bin/env bash
endif
test: clean build
${SHELL} ./utils/tests.sh
有没有人能巧妙地解决我的问题?
【问题讨论】:
-
订阅学习结果:)
-
究竟在什么时候将
/usr/bin/env替换为C:/Program Files/Git/usr/local以及由谁/什么替换?此外,它绝对必须是SHELL:=/usr/bin/env bash吗?为什么不将其设置为/bin/bash、/usr/bin/bash或使用/usr/bin/env bash时运行 Bash 的任何路径?这将消除等式中的空格,您可以在整个过程中使用"${SHELL}"。 -
@Maxxim 在执行
"${SHELL}" ./utils/tests.sh期间,/usr/bin/env 变量被 MINGW 替换。使用/usr/bin/env bash的原因来自这里:stackoverflow.com/questions/16365130/… -
@BennyNeugebauer:我知道这一点,事实上,我总是尽可能自己使用
/usr/bin/env ...。但是,这只是一个建议,而不是必需品。但我对别的东西很好奇:为什么要使用像${SHELL} ./utils/tests.sh这样的调用呢?为什么不直接运行./utils/tests.sh并将#!/usr/bin/env bash放入该脚本中呢?为什么要通过shell来运行脚本?有什么特别的原因吗?
标签: linux bash shell makefile mingw