Если оболочка по умолчанию не совместима с bash, почему скрипты bash не работают?
Моя оболочка по умолчанию - рыба, потому что она намного приятнее. Но часто, когда я запускаю сценарии, я получаю сообщения об ошибках, которые, похоже, происходят из-за сценария bash, обрабатываемого fish. Я думаю, это потому, что автор сценария предположил, что оболочкой по умолчанию является bash, но я не понимаю этот механизм.
Например, сценарий CrashPlan install.sh начинается с bash shebang:
~/CrashPlan-install> head install.sh
#!/bin/bash
#############################################################
# Linux Client Installer Script
#############################################################
Поэтому, когда я бегу ./install.sh
это должно быть обработано Bash, верно? Терминальная оболочка по умолчанию должна быть неактуальной. Тем не менее, когда моя оболочка по умолчанию - fish, запуск таких сценариев заставляет fish возвращать ошибки, как если бы он обрабатывал сценарий:
fish: Expected a command name, got token of type “Run job in background”. Did you mean
“COMMAND; and COMMAND”? See the help section for the “and” builtin command by typing “help and”.
Standard input: sed -imod "s|Exec=.*|Exec=/usr/local/crashplan/bin/CrashPlanDesktop|"
/home/username/Desktop/CrashPlan.desktop && rm -rf /home/username/Desktop/CrashPlan.desktopmod
Это из-за неправильной конфигурации моего компьютера или из-за того, что скрипт написан непереносимым способом?
1 ответ
Поэтому, когда я бегу
./install.sh
это должно быть обработано Bash, верно?
В самом деле. Это именно то, для чего нужен Шебанг.
Поиск проблемы
Сохранить следующее как
test.sh
и попытаться запустить его из рыбы.#!/bin/bash true && true
Он работает на моем компьютере, и на вашем.
Проверьте, если первая строка
install.sh
содержит только символы#!/bin/bash
,Невидимые символы (такие как разрыв строки CR) могут запутать рыбу.
Бежать
/bin/bash --version
проверить, что bash на самом деле bash и не был случайно заменен / изменен с течением времени.
install.sh
$SRC_USER
это просто синоним, для которого сценарий создает $SUDO_USER
,
В результате, когда скрипт запускается с привилегиями root, команда
su ${SRC_USER} -c "sed -imod \"s|Exec=.*|Exec=${GUISCRIPT}|\" ${DESKTOP_LAUNCHER} && rm -rf ${DESKTOP_LAUNCHER}mod"
автоматически использует оболочку пользователя sudo по умолчанию, то есть fish.
Чтобы переопределить это значение по умолчанию, добавьте инструкцию -s /bin/bash
к su
команда.