Я не думаю, что запуск не -исполняемого файла завершается сбоем намеренно для предотвращения случайного выполнения потенциально опасного кода. Это всего лишь часть семантики execve
:, она не работает с EACCES
, если «Разрешение на выполнение отказано для файла, скрипта или интерпретатора ELF». (Я цитирую справочную страницу Linux execve
. POSIX говорит нечто подобное :«Отказано в разрешении на поиск для каталога, указанного в префиксе пути к новому файлу образа процесса, или новый файл образа процесса отказывает в разрешении на выполнение». )Unix/Linux никогда особо не заботились о том, чтобы пользователи не сбились с ног.
Я думаю, что объяснение более прозаично. :Спецификации для выполнения и поиска различны. Прямое выполнение просит ядро выполнить заданную команду, что обеспечивает привилегии выполнения. Поиск файла просто определяется как его чтение и выполнение; на самом деле справочная страница bash
явно указывает, что «Файл поиск в PATH
не обязательно должен быть исполняемым». POSIX говорит «Однако, в отличие от обычного командного поиска, файл, который ищет утилита точка , не обязательно должен быть исполняемым».(.
эквивалентно source
.)
Обратите внимание, что вы можете запускать двоичные файлы, даже если они не являются исполняемыми, используя метод, аналогичный их поиску:
$ cp /bin/ls.
$ chmod 644 ls
$ /lib64/ld-2.26.so./ls
Интересна точка зрения Кусалананды о сравнении bash
source
и POSIX .
. В режиме, отличном от -POSIX, если source
задан аргумент без пути, он пытается найти его в PATH
, а если не находит, ищет в текущем каталоге; в режиме POSIX это не так, потому что POSIX это запрещает:
Some older implementations searched the current directory for the file, even if the value of PATH disallowed it. This behavior was omitted from this volume of POSIX.1-2008 due to concerns about introducing the susceptibility to trojan horses that the user might be trying to avoid by leaving dot out of PATH.
Это на самом деле мало что меняет в данном обсуждении, поскольку аргумент с путем будет обработан source
или .
в любом случае. (И действительно, всегда следует использовать путь, даже если только относительный,для source
аргументов, чтобы избежать сюрпризов при попытке source
чего-то, что также на вашем PATH
. Попробуйте создать файл с именем test
и найти его с source test
в bash
, чтобы понять, что я имею в виду.)