Почему следующий bash-скрипт удаляет сам себя?

Вопрос или проблема

Если вы создадите исполняемый файл со следующим содержимым и запустите его, он удалит сам себя.
Как это работает?

#!/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, которой передается имя скрипта в качестве аргумента, что и приводит к его удалению.

Оцените материал
Добавить комментарий

Капча загружается...