4

Моя оболочка по умолчанию - рыба, потому что она намного приятнее. Но часто, когда я запускаю сценарии, я получаю ошибки, которые, похоже, происходят из-за сценария 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 ответ1

5

Поэтому, когда я запускаю ./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 .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .