我正在研究在MakefileLinux 環境和 Windows 環境中執行的(通過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
有沒有人對我的問題有一個聰明的解決方案?
uj5u.com熱心網友回復:
你可以替換:
SHELL:=/usr/bin/env bash
使用其中之一(或任何直接通向 Bash 可執行檔案的路徑):
SHELL:=/bin/bash
SHELL:=/usr/bin/bash
SHELL:=bash
這將從方程中消除空間。
話雖如此,您還應該能夠直接運行命令,即:
./utils/tests.sh
代替:
${SHELL} ./utils/tests.sh
這將完全消除設定和使用變數的需要SHELL。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/328570.html
上一篇:如何理解破折號的“whilesleep1000;do:;done”中使用的語法?
下一篇:Linux腳本持久化環境變數
