Заставить символические ссылки вести себя более похоже на ярлыки в Windows [закрыто]

POSIX не определяет, как именно интерпретировать shebang. Цитата из семейства функций exec ' ОБОСНОВАНИЕ :

Одна из распространенных исторически распространенных реализаций состоит в том, что execl () , execv () , execle () и execve () функции возвращают ошибку [ENOEXEC] для любого файла, не распознаваемого как исполняемый, включая сценарий оболочки. Когда функции execlp () и execvp () обнаруживают такой файл, они принимают его за сценарий оболочки и вызывают известный интерпретатор команды для интерпретации таких файлов. Теперь этого требует POSIX.1-2008.Эти реализации execvp () и execlp () только выдают ошибку [ENOEXEC] в редком случае проблемы с интерпретатором команд запускаемый файл. Из-за этих реализаций ошибка [ENOEXEC] не упоминается для execlp () или execvp () , хотя реализации все еще могут давать ее .

Другой способ, которым некоторые исторические реализации обрабатывают сценарии оболочки , - это распознавание первых двух байтов файла как символа строки "#!" и используя остаток от первой строки файла как имя интерпретатора команд для выполнения.

Одним из возможных источников недоразумений, отмеченных разработчиками стандартов, является то, как содержимое файла образа процесса влияет на поведение семейства функций exec. Ниже приводится описание предпринятых действий :

  1. Если файл образа процесса является допустимым исполняемым файлом (в формате, который является исполняемым и допустимым и имеет соответствующие привилегии) ​​для этой системы , затем система выполняет файл.

  2. Если файл образа процесса имеет соответствующие привилегии и имеет формат, который является исполняемым, но недопустимым для этой системы (например, распознанный двоичный файл для другой архитектуры), то это ошибка и {{1 }} errno имеет значение [EINVAL] (см. ОБОСНОВАНИЕ на [EINVAL] далее).

  3. Если файл образа процесса имеет соответствующие привилегии, но не распознается иным образом:

    1. Если это вызов execlp () или execvp () , то они вызывают интерпретатор команд, предполагающий, что файл образа процесса является сценарием оболочки .

    2. Если это не вызов execlp () или execvp () , то возникает ошибка и errno устанавливается на [ENOEXEC].

И ранее в ОПИСАНИИ говорилось, что execlp и execvp должны запускать сценарии с sh :

В случаях, когда другие члены семейства функций exec не работают и устанавливают errno на [ENOEXEC], execlp () и execvp ( ) функции должны выполнять интерпретатор команд, а среда выполняемой команды должна быть такой, как если бы процесс вызвал утилиту sh с помощью execl () следующим образом:

 execl (, arg0, file, arg1, ..., (char *) 0); 
 

где путь к оболочке > - это неуказанный путь для утилиты sh , file - это файл образа процесса, а для execvp () , где arg0 , arg1 и т. Д. Соответствуют значениям, переданным в execvp () в argv [0] , argv 2 , а и так далее.

Итак, эти функции запускают эквивалент sh file ... . И когда сценарий запускается из оболочки POSIX, эффекты shebang не определены. См. 2.1, Введение в оболочку :

  1. Оболочка считывает ввод из файла (см. sh ), из параметра -c или из параметра system () и popen () , определенные в томе Системные интерфейсы POSIX.1-2008.Если первая строка файла команд оболочки начинается с символов « #! », результаты не указаны.

Zsh не против, bash:

$ cat foo.sh
#! env perl
echo $0
$ zsh -c ./foo.sh
Can't locate object method "echo" via package "./foo.sh" (perhaps you forgot to load "./foo.sh"?) at ./foo.sh line 2.
$ bash -c ./foo.sh
bash: ./foo.sh: env: bad interpreter: No such file or directory

Не полагайтесь на то, что не указали поисковые запросы PATH в shebang. (Я знаю, что я запускал zsh -c ./foo.sh вместо zsh foo.sh , однако цель здесь заключалась в том, чтобы показать, что делают оболочки при выполнении команд, они могут отличаться. )

1
09.05.2016, 12:47
1 ответ

Символическая ссылка уже ведет себя как ярлык Windows, поскольку содержит только путь к целевому файлу.

Похоже, что символическая ссылка нацелена на файл для установки игры, а не на файл для запуска игры.

2
27.01.2020, 23:35

Теги

Похожие вопросы