Dlaczego poniższy skrypt się usuwa?


84

Jeśli utworzysz plik wykonywalny z następującą zawartością i uruchomisz go, zostanie on usunięty.
Jak to działa?

#!/bin/rm


@DigitalTrauma Heh, to była moja pierwsza myśl, kiedy to zobaczyłem.
kot

nie chodzi o rm, chodzi o #!. Pytanie może zostać przeformułowane na temat działania dowolnego skryptu wykonywalnego z #!działaniem.
njzk2

1
Jak udało ci się na to natknąć?
user1717828

1
To zdecydowanie epickie pytanie. Żałuję, że mogę głosować tylko raz.
Danila Kiver

Odpowiedzi:


112

Jądro interpretuje wiersz rozpoczynający się od #!i używa go do uruchomienia skryptu, przekazując nazwę skryptu; więc to się kończy

/bin/rm scriptname

któ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.)scriptnamePATHPATH#!/bin/echo

Jak wskazał hobbs , oznacza to, że twój skrypt jest w rzeczywistości rmskryptem, a nie bashskryptem - 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.


9
Inne nazwy „#!” możesz usłyszeć „pound bang” i „hash bang”. Szczegółowe informacje można znaleźć na stronie en.wikipedia.org/wiki/Shebang_(Unix) .
jp

@jlp Pound bang? Czy to jest jak „huk za grosze”? Heh ...
kot

Przypomina mi stary CrunchBang
Xen2050

1
Technicznie argumentem rmbę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 ./scriptnamei jeśli wywołałeś go jako scriptname, to /path/to/scriptnametam /path/tobędzie pozycja, w $PATHktórej znaleziono ten skrypt. Zazwyczaj dzieje się tak tylko scriptnamewtedy, gdy masz pusty ciąg znaków $PATHi wywołałeś skrypt jako scriptnamei scriptnameznajduje się on w bieżącym katalogu.
Stéphane Chazelas
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.