Если Терминал macOS выдает ошибку «permission denied» при запуске локального скрипта оболочки, сначала проверьте, находитесь ли вы в правильной папке и доступен ли файл для чтения. Затем добавьте разрешение на выполнение для вашего пользователя с помощью chmod u+x, если вы планируете запускать его напрямую. Если это не решит проблему, проверьте родительские папки и не блокирует ли macOS доступ к файлу приложению, запустившему оболочку. Не используйте sudo или массовое изменение разрешений в качестве первичного решения.
1. Проверьте путь к скрипту и текущую папку
Откройте Терминал и перейдите в папку со скриптом. Возьмите путь в кавычки, если он содержит пробелы:
cd "/Users/yourname/Projects/My Scripts"
ls -l "./build.sh"
Замените путь и имя файла из примера на свои. Вывод команды ls -l покажет права доступа и владельца файла. Если указано, что файл не найден, найдите правильную папку или укажите полный путь. Относительный путь вроде ./build.sh означает «build.sh в текущей папке»; поиск в других папках при этом не выполняется.
2. Добавьте разрешение на выполнение для скрипта
Если файл существует и принадлежит вам, добавьте разрешение на выполнение только для вашей учетной записи, а затем запустите его из его папки:
chmod u+x "./build.sh"
./build.sh
В руководстве Apple по написанию скриптов оболочки рекомендуется использовать chmod u+x перед запуском скрипта. Символ u ограничивает изменение только владельцем файла; +x добавляет разрешение на выполнение. Это безопаснее, чем chmod 777, предоставляющая права на чтение, запись и выполнение всем подряд. Apple’s Shell Script Basics
Если Терминал по-прежнему сообщает «permission denied», снова проверьте права доступа с помощью ls -l. Вы также можете проверить владельца файла командой ls -l и имя вашей учетной записи командой whoami. Если скрипт принадлежит другой учетной записи и у вас нет прав на его изменение, используйте копию в принадлежащей вам папке или попросите владельца либо администратора предоставить соответствующий доступ. Не переназначайте права на владение системными файлами в качестве обходного пути.
3. Проверьте доступ к папкам и содержимое скрипта
Для выполнения требуется доступ по всему пути, а также права на сам скрипт. Проверьте родительские папки скрипта, если вы не можете войти в его каталог или добраться до файла. Если скрипт находится на общем, внешнем или управляемом томе, правила доступа могут отличаться; попробуйте скопировать его в свою папку, если такое копирование допустимо.
Если же команда возвращает Permission denied в момент, когда скрипт пытается создать или изменить выходной файл, возможно, скрипт исполняем, но у него нет прав на запись в целевую директорию. Проверьте папку назначения и путь внутри скрипта. Не делайте скрипт доступным для записи или выполнения всеми пользователями только для того, чтобы обойти ошибку.
Если скрипт находится на «Рабочем столе» (Desktop), в «Документах» (Documents) или «Загрузках» (Downloads), параметры конфиденциальности macOS также могут иметь значение, когда его запускает не Терминал, а другое приложение. В «Системных настройках» откройте Конфиденциальность и безопасность > Файлы и папки и проверьте список разрешений для соответствующего приложения. Apple описывает эти элементы управления как доступ конкретного приложения к определенным расположениям. Ошибка разрешений из команды оболочки сама по себе еще не доказывает, что виной всему именно эта настройка конфиденциальности. Apple: Управление доступом к файлам и папкам на Mac
4. Если прямой запуск не удался, запустите интерпретатор явно
Файл скрипта может быть доступен для чтения вашей учетной записью, но не иметь прав на выполнение. Если это скрипт оболочки, вы можете указать его интерпретатору прочитать и выполнить его напрямую:
/bin/sh "./build.sh"
Используйте это, только если скрипт предназначен для sh. Если в его первой строке указан другой интерпретатор, например Bash, используйте именно его; строка интерпретатора (строка #!, или шебанг) определяет, как именно должен выполняться скрипт. Apple рекомендует включать эту строку для единообразия. Apple’s Shell Script Basics
Запуск через интерпретатор позволяет обойти необходимость в правах на выполнение файла скрипта, но не дает прав на чтение скрипта или доступ к используемым им файлам. Если сообщение об ошибке сменилось на отсутствие интерпретатора или синтаксическую ошибку, устраняйте эту конкретную проблему: она отличается от отсутствия прав на выполнение.
5. Не используйте sudo и не отключайте механизмы безопасности в качестве быстрого решения
Команда sudo запускает команду с повышенными привилегиями; она не исправит отсутствие файла, неверный путь или непроверенный скрипт. Используйте ее только тогда, когда понимаете, почему задаче требуются права администратора, и доверяете источнику и содержимому скрипта. Неразборчивые изменения вроде chmod 777 могут сделать файлы доступными для изменения другими пользователями.
Сообщение скрипта оболочки «permission denied» также отличается от предупреждения Gatekeeper о приложении, которое macOS не может проверить. Описанные Apple действия для кнопки «Открыть в любом случае» применимы к предупреждениям приложений и требуют уверенности в надежности приложения; они не являются общим решением для прав доступа к файлам оболочки. Apple: Безопасное открытие приложений на Mac
Быстрая диагностика
- Сразу выводится
./script.sh: permission denied: проверьте разрешение на выполнение файла; если вы являетесь его владельцем и доверяете ему, выполнитеchmod u+x "./script.sh". - Файл не найден: проверьте текущую папку и точное имя файла.
- Скрипт запускается, затем доступ к команде блокируется: проверьте конкретный файл или папку, к которым пытается обратиться эта команда.
- Предупреждение системы сообщает, что разработчика невозможно проверить: следуйте инструкциям Apple по безопасности приложений только после проверки источника приложения; это предупреждение не связано с правами оболочки на выполнение.
Эти проверки позволяют локализовать проблему: путь к скрипту, бит исполнения, доступ к используемому им файлу либо настройки конфиденциальности или безопасности конкретного приложения. Изменяйте только то разрешение или параметр, на который указывают факты, и запустите ту же команду снова, чтобы увидеть, изменилась ли ошибка.
Источники
- Shell Script Basics — Apple Developer
- Control access to files and folders on Mac — Служба поддержки Apple
- Open apps safely on your Mac — Служба поддержки Apple