Если вы создадите исполняемый файл со следующим содержимым и запустите его, он удалит сам себя.
Как это работает?
#!/bin/rm
rm
, это о #!
. Вопрос можно перефразировать, как работает любой исполняемый скрипт с #!
работающим.
Если вы создадите исполняемый файл со следующим содержимым и запустите его, он удалит сам себя.
Как это работает?
#!/bin/rm
rm
, это о #!
. Вопрос можно перефразировать, как работает любой исполняемый скрипт с #!
работающим.
Ответы:
Ядро интерпретирует строку, начинающуюся с, #!
и использует ее для запуска скрипта, передавая имя скрипта; так что это в конечном итоге работает
/bin/rm scriptname
который удаляет скрипт. (Как указывает Стефан Шазелас , здесь достаточно найти сценарий - если вы указали относительный или абсолютный путь, он передается как есть, в противном случае любой путь, в котором был найден, будет добавлен, включая, возможно, строку emptry, если ваш содержит это и скрипт находится в текущем каталоге. Вы можете поиграться с эхо-скриптом -, чтобы увидеть, как это работает.)scriptname
PATH
PATH
#!/bin/echo
Как указал Хоббс , это означает, что ваш скрипт на самом деле является rm
скриптом, а не bash
скриптом - последний будет начинаться с #!/bin/bash
.
Посмотрите, как программы запускаются для деталей о том, как это работает в Linux; комментарии к этой статье дают подробности для других платформ. #!
называется шебанг, вы найдете много информации, выполнив поиск по этому термину (спасибо Аарону за предложение). Как указал jlp , вы также найдете его упоминаемым как «фунт взрыв» или «хэш-взрыв» ( #
обычно известный как «фунт» - в странах, которые не используют £
- или «хэш», и !
как «взрыв») ). Википедия имеет больше информации.
rm
будет путь к скрипту, то есть первый аргумент системного вызова execve (), сделанного процессом. Как правило, если вы запустили скрипт как ./scriptname
, это будет, ./scriptname
и если вы вызвали его как scriptname
, это будет /path/to/scriptname
где /path/to
находится запись, $PATH
где этот скрипт был найден. Как правило, это происходит только в том scriptname
случае, если у вас есть пустая строка, $PATH
и вы вызвали скрипт как scriptname
и scriptname
есть в текущем каталоге.