我设置了这种 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
是比 更精简、更快的 shellbash
,功能较少,但包装器脚本很少需要这些高级功能。