
./스크립트.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일)
'프로그래밍 > LINUX SHELL SCRIPT' 카테고리의 다른 글
| LINUX SHELL - 로그 특정 문자 발생시 telegram 알림처리 (0) | 2022.07.04 |
|---|
댓글