È il comportamento di. * Da includere. e .. definito in LSB o POSIX o qualche altra specifica?


Risposte:


10

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.


nota: bashnon sempre conforme a POSIX. solo quando viene invocato come sh.
strugee,

4

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).



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.