본문 바로가기
프로그래밍/LINUX SHELL SCRIPT

zsh: permission denied: ./test.sh 오류 해결 (chmod +x 실행 권한, 맥 터미널)

by 애플 로그 2026. 10. 16.
반응형

./스크립트.sh 로 실행했는데 "zsh: permission denied" 가 뜨면, 거의 대부분 그 파일에 실행 권한(x)이 없어서입니다. chmod +x 파일명 한 줄이면 해결되고, 그래도 안 되면 줄바꿈 문자(CRLF)나 폴더를 실행한 경우를 의심하면 됩니다.

테스트 환경: macOS 26.6.2 (arm64), zsh 5.9, GNU bash 3.2.57

터미널에 찍힌 오류 그대로

새로 만든 스크립트 파일을 실행하면 이렇게 나옵니다. 종료 코드 126은 "파일은 찾았지만 실행할 수 없음"이라는 뜻입니다.

% ./hello.sh
zsh: permission denied: ./hello.sh
% echo "exit=$?"
exit=126

bash에서 실행하면 문구만 조금 다르고 원인은 같습니다. 리눅스 서버에서 자주 보는 형태가 이쪽입니다.

$ /bin/bash -c './hello.sh'
/bin/bash: ./hello.sh: Permission denied

왜 막히는지 권한부터 봅니다

파일을 새로 만들면 보통 읽기, 쓰기 권한만 붙고 실행 권한은 없습니다. stat 으로 권한 문자열을 보면 x가 하나도 없습니다.

% stat -f "%Sp %N" hello.sh
-rw-r--r-- hello.sh

맨 앞 한 글자는 파일 종류이고, 그다음 세 글자씩 소유자, 그룹, 그 외 사용자의 권한입니다. rw- 는 읽기와 쓰기만 되고 실행(x)은 안 된다는 뜻입니다. 리눅스에서는 ls -l 로 같은 문자열을 볼 수 있습니다.

chmod +x 로 실행 권한 주기

실행 권한을 붙이고 다시 실행하면 바로 됩니다.

% chmod +x hello.sh
% stat -f "%Sp %N" hello.sh
-rwxr-xr-x hello.sh
% ./hello.sh
hello, script

+x 는 소유자, 그룹, 그 외 사용자 모두에게 실행 권한을 줍니다. 나만 실행하면 되는 파일이라면 u+x 를 쓰면 소유자에게만 붙습니다. 숫자로 쓰는 755 는 +x 를 준 결과와 같습니다.

명령 결과 권한 의미
chmod +x hello.sh -rwxr-xr-x 모두 실행 가능
chmod u+x hello.sh -rwxr--r-- 소유자만 실행 가능
chmod 755 hello.sh -rwxr-xr-x +x 와 같음
chmod 644 hello.sh -rw-r--r-- 실행 권한 없음 (새 파일 기본)

권한을 바꾸기 싫거나 한 번만 돌려 볼 때는 셸에 파일을 넘기는 방법도 있습니다. 이 경우는 실행 권한이 없어도 됩니다.

% zsh hello.sh
hello, script

권한을 줬는데도 안 될 때 확인할 것

윈도우에서 만든 파일을 가져왔다면 줄 끝에 CRLF(\r\n)가 붙어 있을 수 있습니다. 이때는 permission denied 대신 bad interpreter 오류가 나는데, 첫 줄 #!/bin/zsh 뒤에 보이지 않는 \r 이 붙어서 그런 이름의 프로그램을 찾지 못하는 겁니다.

% ./crlf.sh
zsh: ./crlf.sh: bad interpreter: /bin/zsh^M: no such file or directory
% file crlf.sh
crlf.sh: Paul Falstad's zsh script text executable, ASCII text, with CRLF line terminators
% sed -i '' $'s/\r$//' crlf.sh
% ./crlf.sh
hello, crlf

file 명령 결과에 with CRLF line terminators 가 보이면 sed 로 \r 을 지우면 됩니다. 맥 sed 는 -i 뒤에 빈 따옴표('')가 필요하고, 리눅스의 GNU sed 는 sed -i 's/\r$//' 파일명 처럼 빈 따옴표 없이 씁니다.

폴더 이름을 실수로 실행해도 같은 permission denied 가 나옵니다. 경로를 한 번 더 확인해 보세요.

% ./logs
zsh: permission denied: ./logs

서버에서 chmod 로도 안 되는 경우

파일이 noexec 옵션으로 마운트된 디스크에 있으면 권한이 있어도 실행되지 않습니다. mount 매뉴얼에도 noexec 는 "마운트된 파일 시스템의 실행 파일 실행을 허용하지 않음"으로 설명돼 있습니다. 보안 때문에 /tmp 를 noexec 로 걸어 둔 서버가 있으니, mount | grep noexec 로 스크립트가 있는 경로가 포함돼 있는지 보고 다른 폴더로 옮겨서 실행하면 됩니다.

관련 글: linux find 명령어 사용방법

관련 글: linux 프롬프트 설정 방법

이 글의 코드와 명령어는 직접 실행해 확인했고, 정리에는 AI 도구를 활용했습니다.

출처: macOS chmod, stat, mount 매뉴얼(man page), zsh 5.9 실행 결과 (2026년 10월 16일)

댓글