Если оболочка по умолчанию не совместима с 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 команда.

Другие вопросы по тегам