Si Terminal de macOS muestra el error «permission denied» al ejecutar un script de shell local, primero comprueba que estás en la carpeta correcta y que puedes leer el archivo. Luego añade permisos de ejecución para tu usuario con chmod u+x, si pretendes ejecutarlo directamente. Si eso no resuelve el error, comprueba las carpetas contenedoras y si macOS está bloqueando el acceso al archivo a la aplicación que abrió la shell. Evita recurrir a sudo o a cambios amplios de permisos como primera solución.
1. Confirma la ruta del script y tu carpeta actual
Abre Terminal y navega hasta la carpeta que contiene el script. Escribe la ruta entre comillas si contiene espacios:
cd "/Users/yourname/Projects/My Scripts"
ls -l "./build.sh"
Sustituye la ruta y el nombre de archivo del ejemplo por los tuyos. La salida de ls -l muestra los permisos y el propietario del archivo. Si indica que no se encuentra el archivo, localiza la carpeta correcta o usa la ruta completa. Una ruta relativa como ./build.sh significa «build.sh en la carpeta actual»; no busca en otras carpetas.
2. Añade permiso de ejecución a tu script
Si el archivo existe y es de tu propiedad, añade permiso de ejecución únicamente para tu cuenta y, a continuación, ejecútalo desde su carpeta:
chmod u+x "./build.sh"
./build.sh
La guía de scripting en shell de Apple utiliza chmod u+x antes de ejecutar un script. La u limita el cambio al propietario del archivo; +x añade el permiso de ejecución. Esto es más restrictivo que chmod 777, que otorga permisos de lectura, escritura y ejecución a todo el mundo. Apple’s Shell Script Basics
Si Terminal sigue mostrando el mensaje «permission denied», vuelve a inspeccionar los permisos con ls -l. También puedes comprobar quién es el propietario del archivo con ls -l y el nombre de tu cuenta con whoami. Si el script pertenece a otra cuenta y careces de permisos para modificarlo, utiliza una copia en una carpeta que te pertenezca o pide al propietario o administrador que te otorgue el acceso adecuado. No tomes posesión de archivos del sistema como atajo.
3. Comprueba el acceso a las carpetas y el contenido del script
La ejecución requiere acceso a través de la ruta, así como permisos sobre el propio script. Comprueba las carpetas superiores del script si no puedes entrar en su directorio o acceder al archivo. Si se encuentra en un volumen compartido, externo o administrado, sus reglas de acceso pueden diferir; prueba con una copia en una carpeta de tu propiedad, siempre que sea adecuado copiarlo.
Si, por el contrario, tu comando devuelve Permission denied mientras el script intenta crear o modificar un archivo de salida, es posible que el script sea ejecutable pero carezca de acceso de escritura a ese destino. Comprueba la carpeta de destino y la ruta indicada en el script. No hagas que el script sea modificable o ejecutable por todo el mundo solo para sortear un error.
En el caso de un script ubicado en Escritorio, Documentos o Descargas, los controles de privacidad de macOS también pueden influir cuando lo inicia una aplicación distinta de Terminal. En Ajustes del Sistema, abre Privacidad y seguridad > Archivos y carpetas y revisa el acceso listado para la aplicación correspondiente. Apple describe estos controles como accesos por aplicación a ubicaciones específicas. Un error de permisos procedente de un comando de shell no es por sí solo una prueba de que este ajuste de privacidad sea la causa. Apple: Controlar el acceso a archivos y carpetas en el Mac
4. Si la ejecución directa falla, ejecuta el intérprete de forma explícita
Un script puede ser legible por tu cuenta pero carecer de permiso de ejecución. Si se trata de un script de shell, puedes pedirle a su intérprete que lo lea y lo ejecute directamente:
/bin/sh "./build.sh"
Utiliza esto solo cuando el script esté destinado a sh. Si su primera línea especifica otro intérprete, como Bash, utiliza ese en su lugar; la línea del intérprete (la línea #!) especifica cómo está diseñado para ejecutarse un script. Apple recomienda incluir esa línea por coherencia. Apple’s Shell Script Basics
Ejecutarlo a través de un intérprete puede evitar la necesidad de tener permiso de ejecución en el archivo del script, pero no otorga permiso para leer el script ni para acceder a los archivos que este utiliza. Si el mensaje cambia a un error de intérprete no encontrado o a un error de sintaxis, aborda ese problema específico; se trata de una incidencia distinta al permiso de ejecución.
5. No uses sudo ni desactives las protecciones de seguridad como un atajo
sudo ejecuta un comando con privilegios elevados; no soluciona la falta de un archivo, una ruta incorrecta o un script que no has revisado. Utilízalo únicamente cuando entiendas por qué la tarea requiere acceso de administrador y confíes en el origen y el contenido del script. Los cambios generalizados como chmod 777 pueden exponer los archivos a modificaciones por parte de otros usuarios.
El mensaje «permission denied» de un script de shell también es diferente de una advertencia de Gatekeeper sobre una app que macOS no puede verificar. Los pasos documentados por Apple para «Abrir de todos modos» se aplican a los avisos de aplicaciones y requieren tener la seguridad de que la app es de confianza; no son una solución general para los permisos de archivos en la shell. Apple: Abrir apps de forma segura en el Mac
Diagnóstico rápido
./script.sh: permission deniedde forma inmediata: comprueba el permiso de ejecución del archivo; si eres el propietario y confías en él, prueba conchmod u+x "./script.sh".- No se encuentra el archivo: verifica tu carpeta actual y el nombre exacto del archivo.
- El script se inicia y luego se deniega un comando: comprueba el archivo o la carpeta específicos a los que dicho comando está intentando acceder.
- Un aviso de la app indica que no se puede verificar el desarrollador: sigue las instrucciones de seguridad para apps de Apple únicamente tras verificar el origen de la app; ese aviso es independiente del permiso de ejecución de la shell.
Estas comprobaciones reducen el problema a la ruta del script, su bit de ejecución, el acceso a un archivo que utiliza o un control de privacidad o seguridad específico de la aplicación. Modifica únicamente el permiso o el ajuste que coincida con las evidencias y vuelve a ejecutar el mismo comando para ver si el error ha cambiado.
Fuentes
- Shell Script Basics — Apple Developer
- Control access to files and folders on Mac — Soporte técnico de Apple
- Open apps safely on your Mac — Soporte técnico de Apple