Qual è la funzione dell'asterisco come comando autonomo in Unix?


21

Stavo scherzando nel terminale su Red Hat Linux, e quando ho digitato l'asterisco ( *) seguito da return, ed ha eseguito uno dei programmi nella mia directory. Perché?

La mia ipotesi migliore è che Unix lo abbia trattato come un jolly, quindi ha eseguito il primo programma alfabetico. Poiché my_program.exee one_of_my_programs.programpuò essere eseguito semplicemente digitando il nome del file, l'operatore jolly rappresenta tutti i file possibili. Poiché un programma è in ordine alfabetico, Unix lo esegue. È un giudizio corretto?


Penso che non tutte le shell ordinino l'espansione in *ordine alfabetico, ma bash è uno che lo fa.
aschepler,

1
@aschepler: tutte le shell conformi a POSIX devono; vedi pubs.opengroup.org/onlinepubs/9699919799/utilities/… para 3.
dave_thompson_085

Risposte:


20

La tua interpretazione è corretta. Il resto dei file verrà presentato come elenco di parametri.

Si noti che lo farà solo se il programma ha il bit eseguibile impostato e la directory corrente è PATHnell'elenco.

Un paio di note che possono aiutare a capire: -

  • Se si digita, ./*la PATHvoce non è un requisito.
  • Se si digita . *o . ./*e il primo file corrispondente è uno script, non è necessario che sia eseguibile, né è necessario che sia presente la directory corrente PATH(potrebbe non essere vero per shell diverse da bash).

10
"lo farà solo ..." - Può essere più interessante. Se c'è una funzione di shell, builtin o un eseguibile in precedenza PATHcon lo stesso nome del primo file, verrà eseguito questo altro comando. mkdir foo; cd foo; touch rm xyz; ls; *; ls.
Kamil Maciorowski il

@KamilMaciorowski - Punto giusto: la mia affermazione "farà solo questo ..." ha specificato le condizioni necessarie , ma non sufficienti . Il comando si comporterà anche in modo diverso se *è un alias.
AFH,

1
Conclusione: non farlo! Anche se pensi di poter fare affidamento sull'ordine alfabetico di espansione glob, tieni presente che questo ordine dipende dalle impostazioni locali.
Aaron,

oltre a . *o . ./*uno può bash *(o qualsiasi altra shell).
Olivier Dulac il

11

Questo suggerisce che .fa parte della tua PATHvariabile. Questa è una pessima idea per motivi di sicurezza (naturalmente, Windows ha dovuto renderlo un valore predefinito non modificabile).

Tuttavia, questo "suggerimento" è solo leggermente valido: se si dispone di un file denominato rmnella directory corrente, *verrà eseguito correttamente l' impostazione predefinita 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$ 

Come puoi vedere, non è stato rmeseguito nella directory corrente (un file vuoto e non eseguibile) ma piuttosto l'impostazione predefinita del sistema /bin/rm.

Controlla sempre i tuoi comandi quando sono coinvolti i caratteri jolly. Ecco uno dei messaggi più terrificanti che abbia mai letto:

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

Questo è il risultato della chiamata

rm * .o

, più o meno il peggior posizionamento di uno spazio spurio che si può trovare.


1
Non fa male creare una funzione rm()che si aggiunge -iai parametri o controlla i parametri e chiede conferma se ci sono più di un certo numero.
AFH,

3
+1 per "Ecco uno dei messaggi più terrificanti che abbia mai letto".
Mehrdad,

+1 per "Questa è una pessima idea per motivi di sicurezza (naturalmente, Windows ha dovuto renderlo un valore predefinito non modificabile)."
Duncan X Simpson,


C'è una buona ragione per cui Windows lo ha reso un valore predefinito non modificabile. Deve mantenere una catena di compatibilità con le versioni precedenti dai giorni precedenti alle directory implementate da DOS. Tenete presente che in quei giorni nessuno che utilizzava un PC aveva un disco rigido e i floppy disk erano abbastanza piccoli che le directory inizialmente non erano considerate necessarie.
Muzer,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.