Вопрос или проблема
Если вы создадите исполняемый файл со следующим содержимым и запустите его, он удалит сам себя.
Как это работает?
#!/bin/rm
Ядро интерпретирует строку, начинающуюся с #!
, и использует её для запуска скрипта, передавая имя скрипта; в результате запускается
/bin/rm scriptname
что удаляет скрипт. (Как Стефан Шазелас указывает, scriptname
здесь достаточно, чтобы найти скрипт – если вы указали относительный или абсолютный путь, он передаётся как есть, в противном случае путь, который был найден в PATH
, добавляется, включая, возможно, пустую строку, если ваш PATH
содержит её и скрипт находится в текущем каталоге. Вы можете поиграться со скриптом echo — #!/bin/echo
, чтобы увидеть, как это работает.)
Как hobbs указал, это означает, что ваш скрипт на самом деле является скриптом rm
, а не скриптом bash
— последний начинался бы с #!/bin/bash
.
Смотрите Как запускаются программы для подробностей о том, как это работает в Linux; комментарии к этой статье содержат информацию для других платформ. #!
называется шебангом, вы найдете много информации, если будете искать этот термин (спасибо Аарону за предложение). Как jlp указал, вы также найдете это, называемым “паука” или “хеш-банг” (#
обычно называют “пауком” — в странах, где не используют £
— или “хеш”, а !
— “банг”). Википедия имеет больше информации.
Ответ или решение
Этот скрипт удаляет сам себя, поскольку первая строка скрипта начинается с символов #!
, которые указывают на интерпретатор, который должен быть использован для выполнения последующего кода. В данном случае, строка #!/bin/rm
указывает на команду rm
, которая используется для удаления файлов.
Когда вы запускаете этот исполняемый файл, ядро операционной системы интерпретирует строку с #!
и запускает указанный интерпретатор — в данном случае rm
. Параметром, передаваемым этой команде, будет имя самого скрипта. Таким образом, фактически выполняется команда:
/bin/rm scriptname
Где scriptname
— это имя вашего скрипта. Это приводит к тому, что команда rm
удаляет файл, содержащий этот скрипт. Интересно, что если вы укажете относительный или абсолютный путь в этом скрипте, он будет передан без изменений. А если путь не указан, будет использован механизм поиска в переменной PATH
, который может включать в себя текущую директорию (если она указана в PATH
).
Следует отметить, что данный скрипт по существу является не шеловым (bash) скриптом, а скриптом для удаления файлов, так как он начинается с #!/bin/rm
. Для того чтобы создать настоящий bash-скрипт, первая строка должна быть #!/bin/bash
.
Кроме того, стоит упомянуть о так называемом "shebang" (или "пау, банг"), что обозначает комбинацию #!
, которая указывает системе, какой интерпретатор следует использовать для выполнения скрипта. Это важная концепция в Unix-подобных системах и стоит изучить, чтобы лучше понимать работу скриптов.
Таким образом, скрипт удаляет сам себя путем вызова команды rm
, которой передается имя скрипта в качестве аргумента, что и приводит к его удалению.