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


16

예상대로 작동하지 않는 파일 실행 권한에 대해 혼란 스럽습니다. 아마 내 기대가 잘못 되었기 때문일 것입니다. 어쨌든:

스크립트 파일이 s있습니다 ~/bin. 단순성은 에 있습니다 . 이 예제를 위해 파일에는 다음 행만 포함됩니다.

#!/bin/zsh
echo "Test";

매우 간단합니다.

~/bin디렉토리로 이동 chmod하여 파일 권한을s400 - 즉, 읽기 전용 단지 나를 위해. 실행 권한이 없습니다. 그런 다음 경로를 입력하여 스크립트를 실행하여 다음을 제공하십시오.

% ./s
zsh: permission denied: ./s

여태까지는 그런대로 잘됐다. 권한이 잘못되어 파일을 실행할 수 없습니다. 최대 범핑 권한500 (실행 권한 부여) 작동합니다. 이러한 권한으로 파일이 정상적으로 실행됩니다.

% ./s
Test

이것은 모두 예상대로입니다. 하지만 chmod다시 권한을400 (실행 권한을 다시 해제) 시도하십시오.source 하고 파일을 하면 다음과 같은 일이 발생합니다.

% source s
Test

권한이 있지만 400스크립트가 실행됩니다.

여기 내 질문이 있습니다 : 왜 ./s 실패해야합니까?source s 합니까 합니까 정상적으로 실행됩니까? 이것이 실행 권한의 전체 목적을 무효화하지 않습니까?

에서 400권한,sh szsh s 도 작동합니다.

나는 어딘가에서 끔찍한 무언가를하고 있거나 이해하고 있다고 확신합니다. 누군가 지점 밖으로 어디 나에게 수, 사이의 차이를 설명 ./s, source s, sh szsh s?

답변:


17

실행할 때 ./s커널에게 프로그램을 실행하도록 지시합니다 s. 실행 권한이있는 경우 커널은 파일의 처음 몇 바이트를 읽고이 #!행이 스크립트임을 알 수 있도록 인터프리터를 실행하여 스크립트 이름을 첫 번째 인수로 전달합니다. 실행 권한이 없으면 커널은 첫 번째 단계에서 실행을 중단합니다.

을 실행하면을 실행 zsh s하고 zsh호출 된 파일을 읽고 s명령으로 해석 하도록 지시 합니다. 당신은 실행하지 않고 s있습니다 zsh. 와 같은 일이 sh scat s.

source s다시 실행하면 zsh에 파일을 읽도록 지시하므로 중요한 것은 파일에 대한 읽기 권한이 있다는 것입니다.


알겠습니다. 그러나 이것이 실행 권한을 갖는 점을 완전히 물리 치지 않습니까? 설정 여부에 관계없이 항상 스크립트를 실행할 수 있습니다 (또는 스크립트에있는 명령을 해석하도록 zsh에 지시합니다).
C106

또한 cat s파일 내용 만 인쇄합니다. cat s | zsh로 전달하여 zsh인쇄합니다 Test.
C106

1
@ C106 실행 권한의 포인트는 파일이 추가 정보없이 실행할 수있는 것을 나타냅니다. 파일이 setuid / setgid 인 경우에도 중요합니다. 파일은 실행 권한이 없을 수 있지만 그럼에도 불구하고 일부 컴퓨터 프로그램이 실행되는 명령으로 구성됩니다.
Gilles 'SO- 악한 중지'

그것은 많은 의미가 있으며, 실제로는 정말 명백합니다. 감사.
C106
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.