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.

Gilles 'SO- deja de ser malvado'
fuente
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).

lcipriani
fuente
0

La página de manual de Linux hace referencia a POSIX.2, 3.13.

maxschlepzig
fuente
¿El LSB requieren man, man globo las páginas de manual para estar presentes? No pude encontrar hombre aquí (para mi sorpresa).
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
0

Por lo que puedo decir, el LSB 4.1 no requiere bashy solo sh.

Para sh ello sigue POSIX (con una extensión menor no relevante).

Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
fuente