简单的包装脚本生成 100 个 bash 进程

简单的包装脚本生成 100 个 bash 进程

我设置了这种 GCC multilib 包装器:

#file: gcc
#!/usr/bin/env bash
gcc -m32 "$@"

它本质上只是包装了一个 64 位 multilib gcc 以充当非 multilib 32 位 gcc。当我构建某些东西(例如 binutils)时,这会产生数百个bash进程,甚至fork失败。我该如何解决这个问题?

答案1

看来您将脚本命名为 gcc,将其放入路径中,然后递归调用它。要么为您的脚本命名不同的名称,要么使用您实际想要使用的 gcc 可执行文件的显式路径。

答案2

凯文已经找到了核心问题,即您正在递归调用自己的脚本。

避免这种情况的一个简单方法是使用绝对路径调用包装的程序。一种更奇特的方法是手动检查$PATH并跳过您自己的脚本(如 所示$0)。

find_command () {
  script_dir={1%/*}; command_name=${1##*/}
  real_command=
  IFS=':'; set +f
  for d in $PATH; do
    if [ "$d" = "$script_dir" ]; then continue; fi
    if [ -x "$d/$command_name" ]; then real_command="$d/command_name" break; fi
  done
  set -f; unset IFS
  [ -n "$real_command" ]
}
find_command "$0" || {
  echo 1>&2 "$0: cannot find underlying command in \$PATH=$PATH"
  exit 2
}
exec "$0" -m32 "$@"

一些额外的提示:

  • exec如果启动真正的命令后不再需要 shell,请使用该命令。有些 shell 知道这样做是为了优化,但不是全部。
  • 使用#!/bin/sh而不是#!/bin/bash除非您使用 bash 功能。在许多系统上,sh是比 更精简、更快的 shell bash,功能较少,但包装器脚本很少需要这些高级功能。

相关内容