Если оболочка по умолчанию не совместима с bash, почему скрипты bash не работают?

3206
endolith

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

Это из-за неправильной конфигурации моего компьютера или из-за того, что скрипт написан непереносимым способом?

4

1 ответ на вопрос

5
Dennis

Так что когда я запускаю ./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 $ -c "sed -imod \"s|Exec=.*|Exec=$|\" $ && rm -rf $mod" 

автоматически использует оболочку пользователя sudo по умолчанию, то есть fish.

Чтобы переопределить это значение по умолчанию, добавьте инструкцию -s /bin/bashв suкоманду.

`. / test.sh` работает нормально, не выдает ошибок, и шестнадцатеричный дамп test.sh и install.sh идентичен для первых 13 байтов. И да, это `GNU bash, версия 4.2.24 (1) -релиз`. Что-то делать с частью `Exec =` скрипта install.sh? endolith 11 лет назад 0
Может быть, но это трудно сказать вне контекста. Не могли бы вы опубликовать `install.sh` здесь или, если это слишком долго, на Pastebin? Dennis 11 лет назад 0
http://pastebin.com/xAZM1BgF О нет, теперь я вижу, что «Exec» является частью файла `.desktop`, который создает сценарий, а не частью самого сценария. endolith 11 лет назад 0
Я, честно говоря, не понимаю: fish не может обработать ни одну из команд if, так зачем ждать, пока строка sed не захлебнется? Что произойдет, если вы запустите `bash install.sh`? Dennis 11 лет назад 0
То же самое произошло с `sudo install.sh` или` bash install.sh`. Что-то делать с `su $ `? Но оболочкой root по умолчанию является bash. endolith 11 лет назад 0
Я думаю, ты понял. `su` выполняет команду с использованием оболочки` SRC_USER`, которая, если я правильно понял, точно не является `root`. Попробуйте заменить `su` на` su -s / bin / bash`. Dennis 11 лет назад 0
Да, я думаю, что это команда `su`. Я создал пользователя `fishy` с рыбой в качестве оболочки по умолчанию. В bash `su fishy" true && true "` приводит к ошибке. `su fishy -s / bin / bash -c" true && true "` работает отлично. Dennis 11 лет назад 2
Круто, это, кажется, это исправить. Вы можете вставить это в свой ответ, прежде чем я приму это? endolith 11 лет назад 0
Рад за это. Я обновил свой ответ. Dennis 11 лет назад 0