Выполнение скрипта в разрешениях 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?
  • zsh, развернуть * до (a | b | c)
  • Заменить строку в команде, которая будет выполнена в zsh
  • `ls -l` файла и всех каталогов, ведущих к нему?
  • После установки oh-my-zsh: ... /.zshrc:source:34: нет такого файла или каталога ... /.oh-my-zsh/oh-my-zsh.sh
  • Коррумпированные файлы после извлечения с помощью GNU tar Cywin
  • zsh с использованием процессора на 100% после запуска редактора атома
  • команда чтения в ошибке zsh throws
  • Есть ли способ добавить каталог в мой PATH в zsh, только если он еще не присутствует?
  • Почему zsh (oh-my-zsh) заполняет каталоги, которые не существуют?
  • Переключение на `zsh`: все ли скрипты bash совместимы с` zsh`?
  • Linux и Unix - лучшая ОС в мире.