Es el comportamiento de. * Para incluir. y .. definido en LSB o POSIX o alguna otra especificación?


Respuestas:


10

Citando de la especificación Single Unix versión 2, volumen "Comandos y utilidades", §2.13.3 :

Si un nombre de archivo comienza con un punto ( .), el período debe coincidir explícitamente utilizando un punto como primer carácter del patrón o inmediatamente después de un carácter de barra diagonal. (...) No se especifica si un período explícito en una lista de coincidencia de expresiones de paréntesis, como [.abc]puede coincidir con un período inicial en un nombre de archivo.

No hay ninguna excepción que haga que el segundo período en .., o la cadena vacía que sigue al único período en ., no coincida con el comodín en .*. Por lo tanto, el estándar dice que .*coincide .y.. , por muy molesto que sea.

El pasaje anterior describe el comportamiento del shell ( shcomando). La sección sobre la globfunción de biblioteca C hace referencia a este pasaje.

El lenguaje es exactamente el mismo en la versión 3 , también conocida como POSIX: 2001 e IEEE 1003.1-2001, que es lo que implementan la mayoría de los sistemas actuales.

Dash, bash y ksh93 cumplen con POSIX. Pdksh y zsh (incluso debajo emulate sh) no.

En ksh, puede .*omitir .y ..configurar FIGNORE='.?(.)', pero esto tiene el efecto secundario de *incluir archivos de puntos. O puede configurar FIGNORE='.*', pero luego .*no coincide con nada.

En bash, puede .*omitir .y ..configurar GLOBIGNORE='.:..', pero esto tiene el efecto secundario de *incluir archivos de puntos. O puede configurar GLOBIGNORE='.*', pero luego .*no coincide con nada.


nota: bashno siempre cumple con POSIX. solo cuando se invoca como sh.
Strugee

4

Probablemente te refieres a la funcionalidad en bash expansion sobre globignore. Por defecto, la coincidencia de expansión bash. y ... pero leyendo al hombre:

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.

Puede configurar la variable GLOBIGNORE=.:..para que cuando escriba algo como esto:

rm -r * .*

solo está eliminando el directorio actual. El estándar POSIX solo especifica eso. es el directorio actual y ... en el padre del directorio actual. El significado especial de. * Es interpretado por bash u otros shells (o programas como grep).



Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.