Якщо оболонка за замовчуванням не сумісна з bash, чому bash-скрипти не працюють добре?


4

Моя шкаралупа за замовчуванням - це риба, адже це набагато приємніше. Але часто, коли я запускаю сценарії, я отримую помилки, схожі на те, що скрипт bash обробляється рибою. Я думаю, що це тому, що сценарист припускав, що оболонка за замовчуванням є баш, але я не розумію механізму.

Наприклад, сценарій CrashPlan install.sh починається з bash shebang:

~/CrashPlan-install> head install.sh
#!/bin/bash

#############################################################
# Linux Client Installer Script
#############################################################

Тож коли я запускаю, ./install.shце має бути оброблено bash, правда? Оболонка терміналу за замовчуванням має бути неактуальною. Тим не менш, коли моя оболонка за замовчуванням - риба, запуск таких скриптів призводить до того, що риба повертає помилки, ніби вона обробляє сценарій:

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 

Це через неправильну конфігурацію мого комп’ютера або через те, що сценарій написаний не портативним способом?

Відповіді:


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 за замовчуванням, яка є рибою.

Щоб замінити цей стандарт, додайте інструкцію -s /bin/bashдо suкоманди.


./test.shпрацює нормально, не створює помилок, а шістнадцятковий дамп test.sh та install.sh однаковий для перших 13 байт. І так, це GNU bash, version 4.2.24(1)-release. Щось із Exec=частиною сценарію install.sh?
ендоліт

Можливо, але це важко сказати поза контекстом. Чи можете ви розмістити install.shтут або, якщо це занадто довго, на Pastebin?
Денніс

pastebin.com/xAZM1BgF О ні, тепер я бачу, що "Exec" - це частина .desktopфайлу, який створює сценарій, а не частина самого сценарію.
ендоліт

Я, чесно кажучи, не розумію: риба не може впоратися з жодною з команд if, тож навіщо чекати, поки рядок sed задихнеться? Що станеться, якщо ти біжиш bash install.sh?
Денніс

2
Так, я думаю, що це suкоманда. Я створив користувача fishyз рибою як його оболонкою за замовчуванням. Від bash, це su fishy "true && true"призводить до помилки. su fishy -s /bin/bash -c "true && true"працює чудово.
Денніс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.