Якщо створити виконуваний файл із наступним вмістом і запустити його, він видалиться сам.
Як це працює?
#!/bin/rm
rm
, це про #!
. Питання може бути переосмислено, як працює будь-який виконуваний сценарій із #!
твором.
Якщо створити виконуваний файл із наступним вмістом і запустити його, він видалиться сам.
Як це працює?
#!/bin/rm
rm
, це про #!
. Питання може бути переосмислено, як працює будь-який виконуваний сценарій із #!
твором.
Відповіді:
Ядро інтерпретує рядок, починаючи з #!
і використовує його для запуску сценарію, передаючи ім'я сценарію; так що це закінчується
/bin/rm scriptname
який видаляє сценарій. (Як вказує Стефан Шазелас , тут достатньо, щоб знайти сценарій - якщо ви вказали відносний або абсолютний шлях, це пройдено як є, інакше будь-який шлях, який був знайдений, є попереднім, включаючи, можливо, рядок порожніх, якщо ваш містить це і сценарій знаходиться в поточному каталозі. Можна пограти за допомогою ехо-скрипту - - щоб побачити, як це працює.)scriptname
PATH
PATH
#!/bin/echo
Як зазначав Хоббс , це означає, що ваш сценарій насправді є rm
сценарієм, а не bash
сценарієм - останній почав би з цього #!/bin/bash
.
Див. Як Запуск програм для отримання детальної інформації про те, як це працює в Linux; коментарі до цієї статті дають детальну інформацію про інші платформи. #!
називається shebang, ви знайдете багато інформації, шукаючи цей термін (спасибі Аарону за пропозицію). Як вказував jlp , ви також знайдете його як "фунт баг" або "хеш баг" ( #
загальновідомий як "фунт" - у країнах, які не використовують £
- або "хеш", і !
як "удар") ). У Вікіпедії є додаткова інформація.
rm
буде шлях до сценарію, тобто перший аргумент до системного виклику execve (), здійсненого процесом. Як правило, якщо ви запустили сценарій як ./scriptname
, такий буде, ./scriptname
і якщо ви посилаєтесь на нього як scriptname
, це буде /path/to/scriptname
де /path/to
записом, $PATH
де цей скрипт був знайдений. Як правило, це буде лише в тому scriptname
випадку, якщо у вас є порожня рядок $PATH
і ви викликали сценарій як scriptname
і scriptname
є в поточному каталозі.