我正在开发一个在Linux环境和Makefile环境中执行的MINGW64(通过MINGW64)。脚本有一个变量,它指向应该使用的shell命令:
SHELL:=/usr/bin/env bash稍后,该变量将用于运行shell脚本:
${SHELL} ./utils/tests.sh在运行良好的Linux上,但是在WindowswithMINGW64 (Git )上,它失败了,因为/usr/bin/env正在被C:/Program Files/Git/usr/local替换,并且在"Program“中有一个空格字符,它破坏了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有谁能巧妙地解决我的问题吗?
发布于 2021-10-19 16:43:23
你可以替换:
SHELL:=/usr/bin/env bash使用其中之一(或使用任何直接导致Bash的可执行文件的路径):
SHELL:=/bin/bash
SHELL:=/usr/bin/bash
SHELL:=bash这就消除了方程中的空间。
尽管如此,您还应该能够直接运行这些命令,即:
./utils/tests.sh而不是:
${SHELL} ./utils/tests.sh这将完全消除设置和使用变量SHELL的需要。
https://stackoverflow.com/questions/69612558
复制相似问题