zsh에서 스크립트 실행 - 파일 권한

zsh에서 스크립트 실행 - 파일 권한

예상대로 작동하지 않는 파일 권한을 적용하는 것에 대해 혼란스럽습니다. 아마도 내 예상이 틀렸기 때문일 것이다. 그래도:

단순화를 위해 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 szsh에게 파일을 읽도록 지시하므로 파일에 대한 읽기 권한이 있는지가 중요합니다.

관련 정보