Jaka jest funkcja gwiazdki jako samodzielnego polecenia w systemie Unix?

21

Bałam się w terminalu na Red Hat Linux, a kiedy wpisałem gwiazdkę ( *), a następnie return, wykonałem jeden z programów w moim katalogu. Czemu?

Domyślam się, że Unix potraktował go jako symbol wieloznaczny, więc wykonał pierwszy program alfabetyczny. Ponieważ my_program.exei one_of_my_programs.programmożna go wykonać po prostu wpisując nazwę pliku, operator znaku zastępczego reprezentuje wszystkie możliwe pliki. Ponieważ program jest najpierw alfabetyczny, Unix go wykonuje. Czy to prawidłowy osąd?

użytkownik6086585
źródło
Myślę, że nie wszystkie powłoki sortują ekspansję *alfabetyczną, ale bash to robi.
aschepler
1
@aschepler: wszystkie muszle zgodne z POSIX muszą; patrz pubs.opengroup.org/onlinepubs/9699919799/utilities/… para 3.
dave_thompson_085

Odpowiedzi:

20

Twoja interpretacja jest poprawna. Reszta plików zostanie przedstawiona jako lista parametrów.

Zauważ, że zrobi to tylko wtedy, gdy program ma ustawiony bit wykonywalny, a bieżący katalog znajduje się na PATHliście.

Kilka uwag, które mogą pomóc w zrozumieniu:

  • Jeśli wpiszesz ./* wówczas PATHwpis nie jest to wymóg.
  • Jeśli wpiszesz . *lub, . ./*a pierwszym pasującym plikiem jest skrypt, to nie musi on być wykonywalny ani nie powinien znajdować się w bieżącym katalogu PATH(może nie być prawdą dla powłok innych niż bash).
AFH
źródło
10
„zrobi to tylko…” - To może być bardziej interesujące. Jeśli wcześniej jest funkcja powłoki, wbudowana lub plik wykonywalny PATHo takiej samej nazwie jak pierwszy plik, wówczas zostanie wykonane inne polecenie. mkdir foo; cd foo; touch rm xyz; ls; *; ls.
Kamil Maciorowski
@KamilMaciorowski - Racja: moje stwierdzenie „zrobi to tylko…” określiło niezbędne warunki, ale niewystarczające . Polecenie będzie również zachowywać się inaczej, jeśli *jest aliasem.
AFH
1
Wniosek: nie rób tego! Nawet jeśli uważasz, że możesz polegać na kolejności alfabetycznej ekspansji glob, pamiętaj, że ta kolejność zależy od ustawień regionalnych.
Aaron,
oprócz . *lub . ./*jednej puszki bash *(lub dowolnej innej powłoki).
Olivier Dulac
11

To sugeruje, że .jest to część twojej PATHzmiennej. To naprawdę zły pomysł ze względów bezpieczeństwa (naturalnie Windows musiał uczynić go domyślnym niemodyfikowalnym).

Jednak ta „sugestia” jest jedynie umiarkowanie poprawna: jeśli masz plik o nazwie rmw bieżącym katalogu, *dobrze będzie wykonać domyślne rm :

/tmp$ mkdir ohno
/tmp$ cd ohno
/tmp/ohno$ 
/tmp/ohno$ ls
/tmp/ohno$ touch rm what
/tmp/ohno$ ls
rm  what
/tmp/ohno$ *
/tmp/ohno$ ls
rm
/tmp/ohno$ 

Jak widać, nie było go rmw bieżącym katalogu (pustym i niewykonywalnym pliku), ale zostało wykonane domyślnie/bin/rm .

Zawsze sprawdzaj dwukrotnie swoje polecenia, gdy w grę wchodzą symbole wieloznaczne. Oto jedna z najbardziej przerażających wiadomości, jakie kiedykolwiek przeczytano:

rm: cannot remove '.o': No such file or directory

Jest to wynik połączenia

rm * .o

, mniej więcej najgorsze ustawienie fałszywej przestrzeni, jaką można wymyślić.


źródło
1
Nie zaszkodzi stworzyć funkcję, rm()która dodaje -iparametry lub sprawdza parametry i prosi o potwierdzenie, czy jest ich więcej niż pewna liczba.
AFH
3
+1 za „Oto jedna z najbardziej przerażających wiadomości, jakie kiedykolwiek przeczytałem”.
Mehrdad
+1 za „To naprawdę zły pomysł ze względów bezpieczeństwa (oczywiście Windows musiał uczynić go domyślnym niemodyfikowalnym)”.
Duncan X Simpson
FTFY: mv /tmp/ohno /tmp/ohnoes( google.fr/search?q=ohnoes&source=lnms&tbm=isch )
Olivier Dulac
Jest dobry powód, dla którego system Windows uczynił go domyślnym niemodyfikowalnym. Musi zachować ciąg wstecznej kompatybilności z dni poprzedzających implementację katalogów przez DOS. Pamiętaj, że w tamtych czasach nikt nie korzystał z komputera na twardym dysku, a dyskietki były na tyle małe, że katalogi początkowo nie były uważane za konieczne.
Muzer