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 ( sh
comando). La sezione sulla glob
funzione 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 glob
o 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 bash
e solo sh
.
Perché sh
segue POSIX (con un'estensione minore non rilevante).
bash
non sempre conforme a POSIX. solo quando viene invocato comesh
.