У меня есть скрипт в FreeBsd 11
% cat my_script.sh
#!/usr/local/bin/zsh
# [........]
Он имеет атрибут x
:
-rwxr-xr-- 1 root wheel 669 Jun 14 02:45 my_script.sh
Моя оболочка - zsh
. Когда я пытаюсь выполнить его, я получаю ошибку. Это связано с тем, как я ее вызываю:
% sudo ./my_script.sh var1
sudo: ./my_script.sh: command not found
% sudo my_script.sh var1
sudo: my_script.sh: command not found
% sudo source my_script.sh var1
sudo: source: command not found
В чем дело?
update:
Я изменил свой shell на bash, перезагрузился, изменил #!
на bash и теперь у меня:
$ sudo ./my_script.sh test9
sudo: ./my_script.sh: command not found
Проблема в том, что sudo
не гарантирует сохранения вашего текущего каталога или вашего PATH
.
Таким образом, чтобы убедиться, что скрипты будут найдены, укажите полный путь:
sudo /path/to/my_script.sh
Такая же ошибка появляется и для sudo source
, потому что source
— это встроенная оболочка, а не файл. Вместо использования оболочки sudo
выполняет свои аргументы, используя execev
, который ожидает файл.
Для получения дополнительной информации см. man sudo
(в частности, раздел Модель процесса и параметры -E и -s), параметры конфигурации см. в man sudoers
и /etc/sudoers
.
Многие другие варианты указания пути к вашему скрипту с помощью sudo
см. https://stackoverflow.com/questions/12996397/command-not-found-when-using-sudo
% sudo ./my_script.sh var1 sudo: ./my_script.sh: команда не найдена
Это сообщение означает, что либо файл ./my_script.sh
не существует, либо не существует его загрузчик. Для сценария загрузчиком является исполняемый файл, упомянутый в строке shebang.
Убедитесь, что /usr/local/bin/zsh
существует и что это не неработающая символическая ссылка.
Убедитесь, что файл действительно содержит #!/usr/local/bin/zsh
в качестве первой строки, а не, скажем, #!/usr/local/bin/zsh
с некоторыми пробелами или другими невидимыми символами после него или в середине. В частности, обратите внимание, что возврат каретки является одним из невидимых символов, которые могут сломать что-либо. Вы получите CR, если вы создали (или, возможно, отредактировали) сценарий под Windows; если вы редактируете сценарии под Windows, убедитесь, что они сохранены с окончанием строки, установленным на «LF», или «Unix», или «Linux», или как его называет ваш редактор..
% sudo my_script.sh var1 sudo: my_script.sh: команда не найдена
Это не работает по простой причине: myscript.sh
отсутствует в пути поиска команд.
% источник sudo my_script.sh var1 sudo: источник: команда не найдена
Это не работает по простой причине: source
является встроенной оболочкой, а не исполняемым файлом. (Это не имело бы смысла как исполняемый файл, поскольку его цель — выполнить некоторый код оболочки в текущей оболочке — это может сделать только оболочка.)
Какая оболочка запущена в данный момент, не имеет значения для всех трех команд.