Jeśli utworzysz plik wykonywalny z następującą zawartością i uruchomisz go, zostanie on usunięty.
Jak to działa?
#!/bin/rm
shell-script
files
rm
executable
shebang
immibis
źródło
źródło
rm
, chodzi o#!
. Pytanie może zostać przeformułowane na temat działania dowolnego skryptu wykonywalnego z#!
działaniem.Odpowiedzi:
Jądro interpretuje wiersz rozpoczynający się od
#!
i używa go do uruchomienia skryptu, przekazując nazwę skryptu; więc to się kończyktóry usuwa skrypt. (Jak wskazuje Stéphane Chazelas , tutaj wystarczy znaleźć skrypt - jeśli podałeś ścieżkę względną lub bezwzględną, jest ona przekazywana w niezmienionej postaci, w przeciwnym razie poprzednia ścieżka zostanie znaleziona, w tym ewentualnie łańcuch pustki, jeśli zawiera ona i skrypt znajduje się w bieżącym katalogu. Możesz bawić się skryptem echa - - aby zobaczyć, jak to działa.)
scriptname
PATH
PATH
#!/bin/echo
Jak wskazał hobbs , oznacza to, że twój skrypt jest w rzeczywistości
rm
skryptem, a niebash
skryptem - od tego drugiego#!/bin/bash
.Zobacz, jak uruchamiane są programy, aby dowiedzieć się, jak to działa w systemie Linux; komentarze do tego artykułu zawierają szczegółowe informacje na temat innych platform.
#!
nazywa się shebang, znajdziesz wiele informacji, szukając tego terminu (podziękowania dla Aarona za sugestię). Jak wskazał jlp , będzie również określany jako „funt funt” lub „hash bang” (#
jest powszechnie znany jako „funt” - w krajach, które nie używają£
- lub „hash” i!
„bang” ). Wikipedia ma więcej informacji.źródło
rm
będzie ścieżka do skryptu, czyli pierwszy argument wywołania systemowego execve () wykonanego przez proces. Zazwyczaj, jeśli uruchomiłeś skrypt jako./scriptname
, to będzie./scriptname
i jeśli wywołałeś go jakoscriptname
, to/path/to/scriptname
tam/path/to
będzie pozycja, w$PATH
której znaleziono ten skrypt. Zazwyczaj dzieje się tak tylkoscriptname
wtedy, gdy masz pusty ciąg znaków$PATH
i wywołałeś skrypt jakoscriptname
iscriptname
znajduje się on w bieżącym katalogu.