Jestem zdezorientowany, że uprawnienia do wykonywania plików nie zachowują się zgodnie z oczekiwaniami. Prawdopodobnie dlatego, że moje oczekiwania są błędne. Tak czy siak:
Mam plik skryptu, bo dla uproszczenia właśnie się nazywa s
, znajduje się w ~/bin
. Na potrzeby tego przykładu plik zawiera tylko następujące wiersze:
#!/bin/zsh
echo "Test";
Bardzo prosty.
Przechodzę do ~/bin
katalogu i chmod
uprawnienia s
do pliku 400
- tj. Tylko do odczytu tylko dla mnie. Brak uprawnień do wykonania. Następnie próbuję wykonać skrypt, wpisując jego ścieżkę, podając:
% ./s
zsh: permission denied: ./s
Jak na razie dobrze. Plik nie może zostać wykonany z powodu złych uprawnień. Zezwala się również na uprawnienia do blokowania 500
(przyznane uprawnienia do wykonywania) - przy tych uprawnieniach plik działa poprawnie:
% ./s
Test
To wszystko zgodnie z oczekiwaniami. Ale potem chmod
przywracam uprawnienia do 400
(ponownie uruchamiam uprawnienia), próbuję source
plik i tak się dzieje:
% source s
Test
Chociaż uprawnienia są 400
, skrypt wykonuje się.
Oto moje pytanie: dlaczego ./s
zawodzi (tak jak powinno), ale source s
wykonuje się normalnie? Czy nie narusza to całego celu zezwolenia na wykonanie?
Na 400
uprawnienia, sh s
a zsh s
także działa.
Jestem pewien, że gdzieś coś robię lub rozumiem coś okropnie nie tak. Może ktoś wskaż, gdzie mnie i wyjaśnić różnicę między ./s
, source s
, sh s
i zsh s
?
cat s
po prostu drukuje zawartość pliku.cat s | zsh
przekazuje jezsh
i drukujeTest
.