Рейтинг:0

Ошибки сценария оболочки из-за того, что переменная PATH не установлена

флаг gg

Версия Ubuntu: Ubuntu 20.04.2.0 LTS

Оболочка: баш

У меня есть сценарий оболочки, который будет выполняться корень из задания cron root. Но даже когда я запускаю скрипт вручную, он выдает ошибку, говоря следующее

# ./fix_wifi.sh
./fix_wifi.sh: строка 17: : команда не найдена
./fix_wifi.sh: строка 18: : команда не найдена

Строки 17 и 18 содержат эхо и служба перезапуска сетевого менеджера

Предоставление абсолютных путей (/usr/bin, /usr/sbin) для этих двоичных файлов в сценарии не помогло. Итак, я хотел бы указать файлы запуска в начале скрипта, чтобы скрипт знал о переменной PATH (и других соответствующих переменных)

Но для пользователя root в Ubuntu, какой файл запуска мне следует использовать? Я вижу .bashrc и .профиль файлы в домашнем каталоге root /корень.

#!/бин/баш

# Автор xyz
# Должен запускаться как root

если [[ $EUID -ne 0 ]]; тогда
 echo "Этот скрипт должен быть запущен от имени root"
  выход 1
фи

ConnectionStatus=$(сетевое подключение nmcli)

#echo "$ConnectionStatus"

если [ "$ConnectionStatus" != "полный" ]
тогда
  /usr/bin/echo "Обнаружено, что Wi-Fi отключен в "`дату`", поэтому перезапускается диспетчер сети..." | /usr/bin/tee -a /home/john/scripts/wifi_diagnostics.log
/usr/sbin/service перезапуск сетевого менеджера
фи

Примечание: Я забыл указать абсолютный путь для датировать в строке 17. Но это не очень важно здесь, так как строка 18, содержащая служба перезапуска сетевого менеджера все еще ошибка, несмотря на указанный полный путь (/usr/sbin)

pLumo avatar
флаг in
Предоставьте свой скрипт `./fix_wifi.sh`.
bac0n avatar
флаг cn
не должен указывать путь к эху [1] (https://askubuntu.com/a/960826/986805)
флаг hr
Тот факт, что между `: :` нет (очевидно) ничего, заставляет меня задуматься, действительно ли это случай возврата каретки в вашем скрипте, а не что-то связанное с вашей переменной пути
waltinator avatar
флаг it
Всегда вставляйте свой скрипт в `https://shellcheck.net`, средство проверки синтаксиса или устанавливайте `shellcheck` локально. Сделайте использование `shellcheck` частью вашего процесса разработки.
Jarad Downing avatar
флаг sg
Хотя команда `service network-manager restart` должна работать, почему бы не использовать systemd и не заменить ее на `/usr/bin/systemctl reboot network-manager`?
Рейтинг:0
флаг gg

Как предположил steeldriver, ошибка возникла из-за «неразрывного пробела юникода» в строках 17 и 18 в предложении IF (и в строках 7,8, которые проверяют, выполняется ли скрипт пользователем root). Я сделал отступ, чтобы сделать сценарий более читабельным. Я никогда не думал, что это вызовет у меня головную боль. Но урок усвоен.

скриншот из вывода shellcheck

Я думаю, что эта проблема вызвана символами возврата каретки Windows.

Я удалил эти символы и набрал пробел в редакторе vim, и проблема исчезла.

Всем спасибо.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.