Chi si occupa della stella * in eco *


15

Chi tratta (interpreta) il * in

echo *

L'eco vede la stella o la shell occuparsene e restituisce un elenco di nomi di file?

Che dire

cp temp temp*

14
Varia. Shell Unix o Windows?
user1686

Conchiglie @grawity Unix. Mi dispiace non averlo menzionato.
faressoft,

Per Unix, le risposte di seguito sono corrette. (Su Windows, viene eseguito da singoli programmi, sebbene di solito automaticamente dalla libreria di runtime prima di main ().)
user1686

Risposte:


24

bash (o qualunque cosa tu usi come shell), è la prima cosa a leggere qualsiasi input e inizierà a interpretare caratteri speciali come ?e *. *viene espanso a qualsiasi corrispondenza nel CWD , il che significa che l'asterisco viene sostituito da tali corrispondenze.

Nella maggior parte dei casi, ciò è abbastanza avanzato, ma di volta in volta può portare ad alcuni casi confusi.

Considera quanto segue. Una directory ha questo contenuto:

  • test (file normale)
  • test1 (directory)
  • test2 (directory)
  • test3 (directory)

Se poi scrivi mv *qualcosa che sembra strano, succede: test3c'è, ma il resto è sparito. Anche se all'inizio è strano, ha senso una volta capito a cosa passa effettivamente la bash mv. A causa dell'asterisco, bash interpreta mv *as mv test test1 test2 test3, e quando mv ottiene quell'elenco, supporrà che l'ultimo argomento sia la destinazione, che è dove tutti i file sarebbero stati spostati.

Per quanto riguarda i comandi che hai elencato:

  • echo *può funzionare come un uomo povero ls. La shell espanderà l'asterisco a qualunque cosa si trovi in ​​quella directory, e come sono sicuro che già sapete, echoletteralmente farà eco a tutto ciò che Bash gli ha passato come argomentazioni.
  • cp temp temp*si comporterà in qualche modo come il mvcomando che ho descritto sopra, a meno che non vi sia una sola directory denominata temp, nel qual caso il nome di origine e di destinazione è lo stesso, cioè non farà nulla.

8
Non c'è niente di "scarso" nell'uso *invece di ls. Ad esempio, for f in *; doè più affidabile che for f in $(ls)se un nome file contiene spazi bianchi o un carattere glob. (Tuttavia, fallirà se non ci sono file nel CWD, quindi è necessario controllare per quel caso.)
rici

1
@rici Ecco a cosa shopt nullglobserve.
un CVn

3
Per quanto riguarda echo *, quel trucco può salvarti in alcuni casi.
un CVn

2
Comando con: file anteposti con "-" in cartelle arbitrarie che attivano opzioni indesiderate. Rimuoverli non è molto divertente finché non ti rendi conto che rm ./-stupidfile funziona.
ǝɲǝɲbρɯͽ

1
@ ǝɲǝɲbρɯͽ Ho notato che una volta avevo bisogno di eliminare il contenuto di una directory contenente file con il nome file che rappresentano le posizioni in un sistema di coordinate, da -1024x-1024 a 1024x1024. In quel momento ho imparato a scappare per la prima volta.
Jarmund,

5

Come già detto, la shell si espande, *quindi echoricevi come argomenti qualunque cosa la shell trovi nella directory corrente. Tuttavia, si noti che se l'espansione non porta a nulla, ovvero in questo caso se la directory non contiene file non nascosti, *viene lasciata invariata e passata così com'è al comando chiamato (a meno che non vengano utilizzate opzioni non standard con alcune shell come bash.) echo *non si comporterà poi come un povero lsperché il primo non stampa nulla mentre il secondo stampa *.

Allo stesso modo, cp /tmp/temp temp*creerà un file denominato temp*nella directory corrente se non esiste ancora almeno un file con il nome che inizia con temp.

Infine, se vuoi *che sia passato invariato in ogni caso, puoi proteggerlo dall'espansione usando virgolette singole '*', doppie virgolette "*"o barra rovesciata \*.


4

In Bash, la shell se ne occupa. Lo vedi se provi anche *senza eco

Sulla base di alcuni commenti, suggerirei quando si esegue * INVIO, di creare una directory e utilizzare il comando touch per creare alcuni file e assicurarsi che nessuno di essi, o almeno assicurarsi che il primo in ordine alfabetico, non sia il nome di qualsiasi script o comando nel percorso.

$ *
bash: a: command not found

$ echo *
a a.aa a.ab a.b a.htm a.tx

Quindi ls *è un po 'un cliché

In Windows, *è gestito dal comando, quindi dir *.*non è un cliché.

Nota- Vedendo alcuni commenti, aggiungerei, c'è il rischio di eseguire * quindi INVIO. Se hai un file chiamato rm che è il primo nella lista delle directory, allora è pericoloso perché qualsiasi cosa dopo sarebbe stata cancellata. Inoltre, e questo è meno improbabile, se il primo file nell'elenco di directory è il nome di uno script nel percorso, verrà eseguito.


4
Nota che potrebbe esserci un file chiamato rm, ovviamente.
Volker Siegel,

1
... e un altro chiamato -rf
ǝɲǝɲbρɯͽ

1
@ ǝɲǝɲbρɯͽ puoi avere un file il cui nome file è -rf? Ho provato touch -rfe touch \-rfma non lo sta creando.
barlop

@barlop ho commentato sopra; la gui (come gedit) li gestisce bene, ma poiché il guscio (almeno bash) lo fa passare, richiede ./ di fronte. Se dovessi mai creare un file del genere, rm prova a suggerire, ma in caso contrario: spero che questo finisca sempre e solo in una cartella temporanea con bambini usa e getta.
ǝɲǝɲbρɯͽ

@ ǝɲǝɲbρɯͽ Non capisco cosa intendi, ti sto chiedendo come puoi creare un file che si chiama -rf? (Capisco il pericolo di un file chiamato rm e un file chiamato -rf, e il problema di digitare * e premere
invio

-1

Tecnicamente quello che stai scrivendo è corretto, ma senza i collegamenti, questa risposta non fa davvero nulla per rispondere alla domanda. Valuta di incorporare i dettagli pertinenti.
un CVn

@ MichaelKjörling Sono d'accordo con la cosa sui collegamenti, ma l'OP ha semplicemente chiesto se la shell o il comando stesso gestissero gli argomenti. La risposta di Glenn afferma semplicemente che la shell li gestisce, quindi è una risposta accettabile alla domanda.
slhck,

@slhck Ecco perché non ho segnalato come NAA: è rimasto qualcosa che affronta la domanda dopo aver rimosso i collegamenti. Ciò non significa che questa sia una buona risposta secondo me . (Ora vedo che il mio commento iniziale potrebbe essere interpretato diversamente; per questo, mi scuso, ma penso ancora che abbia abbastanza valore per lasciarlo dov'è.)
un CVn

@ MichaelKjörling Concordato. Ho appena lasciato il commento per coloro che lo hanno (e lo faranno) segnalarlo come NAA.
slhck,
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.