Ядро распознает определенные форматы файлов, которые оно может выполнить исходно. Это включает по крайней мере один двоичный формат. Кроме того, файлы, которые начинаются #!
(хижину) считают сценариями; например, если файл расположен в /path/to/script
и начинается #!/bin/bash
затем ядро выполняется /bin/bash /path/to/script arg1 arg2
когда Вы вызываете /path/to/script arg1 arg2
.
Если ядро не распознает формат файла, оно возвращает ENOEXEC (исполнительная ошибка формата) от execve
системный вызов. При следовании традиции с древних дней ядер Unix, которые не имели функции хижины, большинство программ предпринимает вторую попытку выполнить программу, когда первая попытка привела к сбою с ошибкой ENOEXEC: они пытаются выполниться /bin/sh
как интерпретатор сценария.
Bash является существенным исключением: это запускает скрипт сам по себе, не в /bin/sh
. Таким образом, Ваш сценарий работал случайно при вызове его от удара.
Если Вы бросаете строку хижины, Ваш сценарий может быть выполнен под /bin/bash
или под /bin/sh
, В зависимости от того, от какой программы это выполнялось. И /bin/sh
очевидно не поддерживает замену процесса относительно Вашей системы. Это - вероятно, все еще удар (сообщение об ошибке похоже на тот от удара), но когда удар вызывается под именем sh
, это входит в режим эмуляции POSIX, который не поддерживает замену процесса.
Мораль истории: если Вы пишете сценарий удара, необходимо поместить #!/bin/bash
на первой строке.
Я использовал настройки Nvidia, необходимо выполнить его как корень, затем Сохранить Конфигурацию для создания его значением по умолчанию, это сохранит настройки в/etc/X11/xorg.conf