Выполнение скрипта в zsh - права доступа к файлу

16

Я не уверен, что права доступа к исполняемому файлу не соответствуют ожиданиям Вероятно, потому что мои ожидания неверны. Тем не мение:

У меня есть файл сценария, для простоты просто называется 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?

C106
источник

Ответы:

17

Когда вы запускаете ./s, вы указываете ядру выполнить программу s. Если у вас есть разрешение на выполнение, то ядро ​​считывает первые несколько байтов файла, видит #!строку, чтобы узнать, что это скрипт, и запускает интерпретатор, передавая ему имя скрипта в качестве первого аргумента. Если у вас нет разрешения на выполнение, ядро ​​прерывает выполнение на первом шаге.

Когда вы запускаете zsh s, вы выполняете zshи говорите ему прочитать вызванный файл sи интерпретировать его как команды. Вы не выполняете s, вы выполняете zsh. То же самое с sh sили cat s.

Когда вы source sснова запускаете , вы указываете zsh прочитать файл, поэтому важно иметь разрешение на чтение.

Жиль "ТАК - прекрати быть злым"
источник
Хорошо, это имеет смысл. Но разве это не лишает нас смысла иметь разрешение на выполнение? Не имеет значения, установлен он или нет, я всегда смогу выполнить скрипт (или сказать zsh, что он должен интерпретировать команды в скрипте, что эквивалентно).
C106
Кроме того, cat sпросто печатает содержимое файла. cat s | zshпередает их zshи печатает Test.
C106
1
@ C106 Смысл разрешения на выполнение состоит в том, чтобы указать, что файл представляет собой что-то, что вы можете выполнить без дополнительной информации. Это также важно, если файл setuid / setgid. Файл может не иметь разрешения на выполнение, но, тем не менее, состоит из инструкций о том, что какая-то компьютерная программа где-то выполняется.
Жиль "ТАК ... перестать быть злым"
Это имеет большой смысл, и на самом деле невероятно очевидно на самом деле. Благодарю.
C106