If you use a Mac and regularly work in Terminal, you may eventually come across the frustrating “zsh: permission denied” error. This message can appear when trying to run scripts, open files, execute commands, or access certain folders. For beginners, it can feel confusing because the command may look correct, yet macOS refuses to allow it.
Since macOS Catalina, Apple made Zsh (Z Shell) the default shell instead of Bash. While Zsh is powerful and efficient, permission-related issues are common because macOS has strict security settings to protect users from unauthorized changes. Fortunately, most zsh permission denied errors are easy to fix once you understand the root cause.
This guide explains why the error happens, the most effective ways to fix it, and how to prevent it in the future.
What Does “zsh: permission denied” Mean?
The “zsh: permission denied” message means that the shell is preventing you from executing a file, command, or accessing a location because your current user account does not have the required permissions.
For example, you may see errors like:
zsh: permission denied: ./script.sh
or:
zsh: permission denied: Downloads
This usually means one of the following:
- The file is not marked as executable
- You do not own the file
- macOS security restrictions are blocking access
- You need administrator privileges
- The file is quarantined
- The command syntax is incorrect
Understanding which situation applies is the first step toward fixing the problem.
Common Causes of Zsh Permission Denied Errors
There are several possible reasons why this issue occurs on Mac.
Missing Execute Permission
Scripts and executable files need permission to run. Without execute access, Zsh blocks the action.
Incorrect File Ownership
If another user or system process owns the file, your account may not have sufficient access.
Folder Restrictions
Some directories require elevated privileges or have read-only settings.
macOS Security Features
System Integrity Protection (SIP), Full Disk Access restrictions, and quarantine settings can block commands.
Wrong Command Format
Trying to execute a script incorrectly can trigger permission errors.
Downloaded Files
Files downloaded from the internet may be blocked by Gatekeeper.
How to Check File Permissions
Before applying fixes, inspect the file’s permission settings.
Use this command:
ls -l filename
Example:
ls -l script.sh
Output may look like:
-rw-r--r-- 1 user staff 120 Apr 10 12:00 script.sh
Here:
r= readw= writex= execute
If the execute (x) permission is missing, the script cannot run.
Fix 1: Add Execute Permission with chmod
The most common solution is making the file executable.
Use:
chmod +x filename
Example:
chmod +x script.sh
Then run:
./script.sh
Why This Works
The chmod command changes file permissions, and +x grants execute permission.
Best Practice
Only give execute permission to trusted files.
Fix 2: Run the Script Using a Shell Interpreter
Sometimes the file doesn’t need direct execution permissions if you explicitly call the shell.
Example:
sh script.sh
or:
bash script.sh
or:
zsh script.sh
Why This Helps
Instead of executing the file itself, you’re asking the shell to interpret it.
This is especially useful for:
- Shell scripts
- Installation scripts
- Setup files
Fix 3: Use sudo for Administrator Privileges
If your user account lacks required permissions, sudo may solve the issue.
Example:
sudo ./script.sh
You’ll need to enter your Mac password.
Important Warning
Use sudo carefully because it grants elevated privileges.
Avoid using it unless:
- You trust the command
- System-level changes are necessary
- Regular permissions fail
Fix 4: Change File Ownership
If another account owns the file, you may need to transfer ownership.
Check ownership:
ls -l
Change ownership:
sudo chown yourusername filename
Example:
sudo chown john script.sh
Why This Works
Ownership determines who can modify or execute files.
Fix 5: Grant Full Disk Access to Terminal
macOS security may block Terminal from accessing protected folders like:
- Documents
- Downloads
- Desktop
- External drives
Steps:
- Open System Settings
- Go to Privacy & Security
- Select Full Disk Access
- Enable Terminal (or iTerm)
- Restart Terminal
Result
Terminal gains broader access to system directories.
Fix 6: Remove Quarantine from Downloaded Files
Downloaded files can be marked as unsafe.
Check attributes:
xattr filename
Remove quarantine:
xattr -d com.apple.quarantine filename
Example:
xattr -d com.apple.quarantine script.sh
Why This Happens
macOS Gatekeeper blocks unfamiliar files for security reasons.
Fix 7: Correct Directory Permissions
Sometimes the folder containing the file has restricted permissions.
Adjust folder access:
chmod 755 foldername
Permission Breakdown:
- 7 = owner full access
- 5 = group read/execute
- 5 = others read/execute
Avoid Overusing 777
chmod 777 foldername
While this grants universal access, it is insecure and should only be used temporarily for troubleshooting.
Fix 8: Verify PATH Issues
If a command exists but isn’t executable from your current shell, PATH may be misconfigured.
Check PATH:
echo $PATH
Locate command:
which commandname
Example:
which python3
Solution
Add missing directories to .zshrc:
export PATH=$PATH:/desired/path
Reload:
source ~/.zshrc
Fix 9: Check Script Header (Shebang)
Scripts should specify which interpreter to use.
Example:
#!/bin/zsh
or:
#!/bin/bash
Without this line, execution may fail.
Fix 10: Disable System Integrity Protection (Advanced)
Some protected system files cannot be modified due to SIP.
Warning:
Only advanced users should consider this.
Check SIP status:
csrutil status
To disable:
- Restart in Recovery Mode
- Open Terminal
- Run:
csrutil disable
Important:
Re-enable SIP after troubleshooting.
Common Mistakes to Avoid
Using chmod 777 on Everything
This creates security risks.
Running Random sudo Commands
Could damage your system.
Ignoring File Ownership
Permissions often depend on ownership.
Editing Protected macOS Files
Can break system functionality.
Forgetting Full Disk Access
Modern macOS privacy controls are stricter than older versions.
Real-World Examples
Example 1: Script Won’t Run
Error:
zsh: permission denied: ./backup.sh
Fix:
chmod +x backup.sh
./backup.sh
Example 2: Downloaded Installer Blocked
Fix:
xattr -d com.apple.quarantine installer.sh
chmod +x installer.sh
./installer.sh
Example 3: Access Denied in Documents Folder
Fix:
- Enable Full Disk Access
- Restart Terminal
Preventing Future Zsh Permission Errors
To avoid repeated issues:
- Store scripts in your home directory
- Use proper permissions during creation
- Avoid unnecessary system folders
- Regularly check ownership
- Update macOS
- Use trusted downloads
- Maintain clean PATH settings
Helpful Terminal Commands Summary
ls -l filename
chmod +x filename
sudo command
sudo chown username filename
xattr -d com.apple.quarantine filename
echo $PATH
which command
source ~/.zshrc
When to Seek Advanced Help
If none of the above fixes work, consider:
- Reinstalling Zsh
- Resetting Terminal preferences
- Creating a new macOS user account
- Booting into Safe Mode
- Contacting Apple Support
Persistent permission issues may indicate:
- Corrupted user permissions
- Broken shell configuration
- System-level security conflicts
Final Thoughts
The “zsh: permission denied” error on Mac Terminal is usually caused by file permissions, ownership settings, or macOS security restrictions. In most cases, the issue can be solved quickly with commands like chmod +x, sudo, or by adjusting Full Disk Access settings.
For beginners, start with the simplest fixes:
- Check permissions
- Add execute access
- Use the correct shell
- Verify ownership
For advanced users, deeper troubleshooting may involve PATH corrections, quarantine removal, or SIP adjustments.
By understanding how macOS handles permissions, you can confidently resolve Terminal errors while keeping your system secure.
FAQs
Why do I get zsh permission denied on Mac?
This happens when your account lacks execute or access permissions for a file or directory.
How do I make a script executable?
Use:
chmod +x script.sh
Is sudo safe?
Yes, when used carefully with trusted commands.
Why does macOS block downloaded scripts?
Gatekeeper may quarantine files downloaded from the internet.
Should I use chmod 777?
Only temporarily for troubleshooting, as it creates security risks.
Does Full Disk Access help?
Yes, especially when Terminal is blocked from protected folders.
Can SIP cause permission denied errors?
Yes, particularly for system-level files and directories.


