Risposte:
Citando dalla specifica Unix singola versione 2, volume "Comandi e utilità", §2.13.3 :
Se un nome file inizia con un punto (
.), il periodo deve essere associato in modo esplicito utilizzando un punto come primo carattere del modello o immediatamente dopo un carattere barra. (...) Non è specificato se un periodo esplicito in un elenco di corrispondenze di espressioni di parentesi, ad esempio[.abc]può corrispondere a un periodo iniziale in un nome file.
Non ci sono eccezioni per cui il secondo periodo ..o la stringa vuota che segue l'unico periodo in .non corrispondano al carattere jolly in .*. Pertanto lo standard dice che .*corrisponde .e.. , per quanto fastidioso possa essere.
Il passaggio sopra descrive il comportamento della shell ( shcomando). La sezione sulla globfunzione della libreria C fa riferimento a questo passaggio.
Il linguaggio è esattamente lo stesso nella versione 3 , nota anche come POSIX: 2001 e IEEE 1003.1-2001, che è ciò che implementano la maggior parte dei sistemi attuali.
Dash, bash e ksh93 sono conformi a POSIX. Pdksh e zsh (anche sotto emulate sh) no.
In ksh, puoi .*saltare .e ..impostando FIGNORE='.?(.)', ma questo ha l'effetto collaterale di creare *file dot inclusi. Oppure puoi impostare FIGNORE='.*', ma .*non corrisponde a nulla.
In bash, puoi .*saltare .e ..impostando GLOBIGNORE='.:..', ma questo ha l'effetto collaterale di creare *file dot inclusi. Oppure puoi impostare GLOBIGNORE='.*', ma .*non corrisponde a nulla.
Probabilmente intendi la funzionalità in espansione bash su globignore. Per impostazione predefinita, la corrispondenza dell'espansione bash. e .. ma leggendo l'uomo:
The GLOBIGNORE shell variable may be used to restrict the set of file names matching
a pattern. If GLOBIGNORE is set, each matching file name that also matches one of
the patterns in GLOBIGNORE is removed from the list of matches. The file names ``.''
and ``..'' are always ignored when GLOBIGNORE is set and not null. However, setting
GLOBIGNORE to a non-null value has the effect of enabling the dotglob shell option,
so all other file names beginning with a ``.'' will match. To get the old behavior
of ignoring file names beginning with a ``.'', make ``.*'' one of the patterns in
GLOBIGNORE. The dotglob option is disabled when GLOBIGNORE is unset.
Puoi impostare la variabile in GLOBIGNORE=.:..modo che quando scrivi qualcosa del genere:
rm -r * .*
stai rimuovendo solo la directory corrente. Lo standard POSIX lo specifica solo. è la directory corrente e .. nel genitore della directory corrente. Il significato speciale di. * È interpretato da bash o altre shell (o programmi come grep).
La pagina man di Linux fa riferimento a POSIX.2, 3.13.
man, man globo le pagine man di essere presente? Non sono riuscito a trovare l'uomo qui (con mia sorpresa).
Per quanto ne so, l'LSB 4.1 non richiede bashe solo sh.
Perché sh segue POSIX (con un'estensione minore non rilevante).
bashnon sempre conforme a POSIX. solo quando viene invocato comesh.