Parece que você nomeou seu script gcc, colocou-o no caminho e o chamou recursivamente. Ou nomeie seu script como algo diferente ou use um caminho explícito para o executável do gcc que você realmente deseja usar.
Eu tenho esse tipo de wrapper GCC multilib configurado:
#file: gcc
#!/usr/bin/env bash
gcc -m32 "$@"
que essencialmente apenas envolve um gcc multilib de 64 bits para atuar como um gcc não-multilib de 32 bits. Quando eu construo algo (como binutils, por exemplo), isso gera centenas de bash
processos, até mesmo fork
falhar. Como posso contornar isso?
Kevin já encontrou a questão central, ou seja, você está chamando seu próprio script de forma recursiva.
Uma maneira simples de evitar isso é chamar o programa empacotado com um caminho absoluto. Uma maneira mais chique é examinar $PATH
manualmente e pular seu próprio script (conforme identificado por $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 "$@"
Algumas dicas adicionais:
exec
se você não precisar mais do shell depois de ativar o comando real. Algumas conchas sabem fazer isso como uma otimização, mas não todas. #!/bin/sh
em vez de #!/bin/bash
, a menos que você esteja usando recursos bash. Em muitos sistemas, o sh
é um shell mais enxuto e rápido que o bash
, com menos recursos, mas os scripts do wrapper raramente precisam desses recursos avançados. Tags bash linux shell-script