【问题标题】:"make -j 4: command not found" when invoking make from a script从脚本调用 make 时出现“make -j 4: command not found”
【发布时间】:2016-01-19 03:11:22
【问题描述】:

我在将 -j 4 添加到我的 make 命令时遇到问题。它导致我的 Bash 脚本失败:

./cryptest.sh: line 208: make -j 4: command not found
ERROR: failed to make cryptest.exe

这是确定何时添加 -j 4 的 Bash。它似乎大部分都在工作:

# $MAKE is already set and either 'make' or 'gmake'
CPU=$(cat /proc/cpuinfo | grep -c '^processor')
if [ "$CPU" -gt "1" ]; then
    echo "$CPU processors, using \"$MAKE -j $CPU\""
    MAKE="$MAKE -j $CPU"
fi

然后,调用它并导致错误的 Bash:

"$MAKE" static dynamic cryptest.exe 2>&1 | tee -a "$TEST_RESULTS"
if [ "${PIPESTATUS[0]}" -ne "0" ]; then
        echo "ERROR: failed to make cryptest.exe" | tee -a "$TEST_RESULTS"
fi

Stack Overflow 上也有类似的问题与其他命令类似,例如 Execute command as a string in Bash,但对我来说如何简单地将命令的参数附加到命令中并不明显。并且在上面的错误中执行明显的结果,所以像How can I concatenate string variables in Bash 这样的问题在这种情况下似乎不起作用。

如何将 -j 4 附加到 $MAKE


我还尝试了以下方法:

MAKE="$MAKE" "-j $CPU"

但结果是:

./cryptest.sh: line 186: -j 4: command not found

最后,有 50 到 75 个:

export CXXFLAGS="..."
"$MAKE" static dynamic ...

所以我想修复 1 个"$MAKE",而不是 50 或 75 次使用它。

【问题讨论】:

  • 你是在windows中做这个吗?在 MS-DOS 上,“-j”选项无效,因为该系统不支持多处理。如果“-j”选项后跟一个整数,这是一次执行的配方数;这称为作业槽数。如果在“-j”选项之后没有看起来像整数的东西,则作业槽的数量没有限制。作业槽的默认数量是一个,这意味着串行执行(一次一件事)。
  • @user3589054 - 它是 Linux。在这种情况下,它是一个 Ubuntu 14.04.3 LTS 服务器。脚本位于cryptest.sh
  • "$MAKE" static dynamic ...为什么要用双引号?

标签: linux bash shell command


【解决方案1】:

您正在尝试运行名为“make -j 4”的命令,而不是带有参数“-j”和“4”的命令“make”。在这种情况下,您可以简单地运行您的命令

$MAKE static dynamic cryptest.exe 2>&1 ...

也就是说,没有引用$MAKE 的扩展名。但是,通常您不应将命令调用存储在变量中,而应仅将命令 names 存储在变量中。将参数存储在(最好)一个数组中。

MAKE=make
MAKEARGS=( -j 4 )

"$MAKE" "${MAKEARGS[@]}" static dynamic cryptest.exe ...

【讨论】:

  • 谢谢切普纳。所以我很清楚...我使用 $MAKE 调用 make without 引号,并使用 MAKE="$MAKE -j 4"。对吗?
  • @jww:是的,这是微不足道的修复;但这不是一个非常健壮或可扩展的方法,这就是为什么这个答案比那个更长。
猜你喜欢
  • 2016-08-14
  • 1970-01-01
  • 2020-05-24
  • 2021-12-03
  • 2023-03-11
  • 1970-01-01
  • 2011-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多