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