예상대로 작동하지 않는 파일 권한을 적용하는 것에 대해 혼란스럽습니다. 아마도 내 예상이 틀렸기 때문일 것이다. 그래도:
단순화를 위해 s
에 있는 스크립트 파일이 있습니다 ~/bin
. 이 예의 목적에 따라 파일에는 다음 줄만 포함됩니다.
#!/bin/zsh
echo "Test";
매우 간단합니다.
~/bin
디렉토리 로 이동했는데 chmod
파일 권한은 s
읽기 400
전용입니다. 실행 권한이 없습니다. 그런 다음 해당 경로를 입력하여 스크립트를 실행하려고 시도했는데 다음과 같은 결과가 나왔습니다.
% ./s
zsh: permission denied: ./s
여태까지는 그런대로 잘됐다. 권한 오류로 인해 파일을 실행할 수 없습니다. 실행 권한을 부여하여 권한을 높이는 것도 500
잘 작동합니다. 이러한 권한을 사용하면 파일이 제대로 실행됩니다.
% ./s
Test
이것은 모두 예상되는 것입니다. 그러나 그런 다음 권한 을 다시 chmod
복원하고 400
(권한을 다시 해제) source
파일을 시도했는데 이런 일이 일어났습니다.
% source s
Test
권한에도 불구하고 400
스크립트가 실행됩니다 .
그래서 내 질문은 다음과 같습니다. 왜 ./s
실패하지만(그래야 하는 것처럼) source s
잘 실행되나요? 이는 권한 실행의 전체 목적을 무효화하지 않습니까?
400
권한 에 따라 작동할 sh s
수도 있습니다 zsh s
.
나는 어딘가에서 심각하게 잘못된 일을 하고 있거나 이해하고 있다고 확신합니다. 누군가 나에게 ./s
, 및 source s
의 차이점을 알려주고 설명할 수 있습니까 sh s
?zsh s
답변1
를 실행할 때 ./s
커널에게 프로그램을 실행하라고 지시합니다 s
. 실행 권한이 있는 경우 커널은 파일의 처음 몇 바이트를 읽고 행을 확인하여 #!
스크립트임을 확인한 다음 인터프리터를 실행하고 스크립트 이름을 첫 번째 인수로 전달합니다. 실행 권한이 없으면 커널은 첫 번째 단계에서 실행을 중단합니다.
를 실행하면 을 zsh s
실행 zsh
하고 호출된 파일을 읽고 s
명령으로 해석하도록 지시합니다. 당신은 공연을 하고 있는 것이 아니라 s
, 공연을 하고 있는 것입니다 zsh
. sh s
또는 와 동일합니다 cat s
.
다시 실행 하면 source s
zsh에게 파일을 읽도록 지시하므로 파일에 대한 읽기 권한이 있는지가 중요합니다.