【问题标题】:Save path with spaces in Makefile variable在 Makefile 变量中用空格保存路径
【发布时间】: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


【解决方案1】:

你可以替换:

SHELL:=/usr/bin/env bash

其中之一(或任何直接通向 Bash 可执行文件的路径):

SHELL:=/bin/bash
SHELL:=/usr/bin/bash
SHELL:=bash

这将消除方程式中的空间。


话虽如此,您也应该能够直接运行命令,即:

./utils/tests.sh

代替:

${SHELL} ./utils/tests.sh

这将完全消除设置和使用变量SHELL 的需要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 2021-10-31
    • 1970-01-01
    相关资源
    最近更新 更多