Kevin уже нашел базовую проблему, а именно, что Вы называете свой собственный сценарий рекурсивно.
Простой способ избежать этого состоит в том, чтобы назвать перенесенную программу с полным путем. Более необычный путь состоит в том, чтобы исследовать $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
если Вам не нужна оболочка еще, после того как Вы запустили реальную команду. Некоторые оболочки знают, чтобы сделать это как оптимизацию, но не все.#!/bin/sh
вместо #!/bin/bash
если Вы не используете функции удара. Во многих системах, sh
более минимизированная, более быстрая оболочка, чем bash
, с меньшим количеством функций, но сценариями обертки редко нуждаются в этих расширенных функциях.PATH
настроен в /etc/profile
, соответствующие файлы в /etc/profile.d/*
, ~/.bashrc
и ~/.bash_profile
для оболочек удара и подобных файлов для других оболочек.
Не ясно из Вашего вопроса, что точная последовательность имеет команды, которые Вы выполнили, но если Вы изменили PATH
прежде, чем возрасти для укоренения, который не будет иметь никакого эффекта.
Если Вы возрастаете для укоренения для выполнения этих команд, необходимо предоставить нам PATH
когда Вы открыли корневую оболочку и оболочку, пользователь root использует.