Выполнение скрипта в разрешениях zsh-файла

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

У меня есть файл сценария, для простоты называется s , расположенный в ~/bin . Для этого примера файл содержит только следующие строки:

 #!/bin/zsh echo "Test"; 

Очень просто.

Я перехожу к директории ~/bin и chmod файлу s до 400 – то есть только для чтения только для меня. Нет разрешения на выполнение. Поэтому я пытаюсь выполнить скрипт, введя его путь, давая это:

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

Все идет нормально. Файл не может быть выполнен из-за неправильных разрешений. Разрешения на опрокидывание до 500 (разрешение на выполнение) тоже отлично работает – с этими разрешениями файл выполняет штраф:

 % ./s Test 

Это все, как ожидалось. Но тогда я разрешаю chmod до 400 (снова разрешить разрешение), попробуйте исправить файл, и это происходит:

 % source s Test 

Хотя разрешения 400 , сценарий выполняется.

Итак, вот мой вопрос: почему ./s терпит неудачу (как и должно), но source s файл source s выполняется нормально? Разве это не разрушает всю цель разрешения на исполнение?

При 400 разрешениях также работают sh s и zsh s .

Я уверен, что я либо что-то делаю, либо понимаю что-то ужасное. Может кто-то указать, где мне, и объяснить разницу между ./s , source s , sh s и zsh s ?

One Solution collect form web for “Выполнение скрипта в разрешениях zsh-файла”

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

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

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

  • Как я могу расширить все переменные в командной строке в Zsh?
  • Как связать последовательность клавиш с виджетами в режиме vi cmd zsh?
  • Заполнение имени файла zsh без учета регистра
  • Отсутствие выделения zsh-синтаксиса в tmux
  • Команда Pipe для хвоста: когда первая команда прервана?
  • Что делает строка `set - $ args` и почему она ведет себя по-разному между Zsh и Bash?
  • Завершения работы перестали работать после обновления zsh
  • Что нужно / не следует входить .zshenv, .zshrc, .zlogin, .zprofile, .zlogout?
  • «Gnome-terminal -e tmux ./» постоянно открывает терминалы
  • 256 цветов в Zsh
  • «Команда не найдена», когда функция sudo'ing от ~ / .zshrc
  • Linux и Unix - лучшая ОС в мире.