Respuestas:
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 ( sh
comando). La sección sobre la glob
funció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.
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).
La página de manual de Linux hace referencia a POSIX.2, 3.13.
man
, man glob
o las páginas de manual para estar presentes? No pude encontrar hombre aquí (para mi sorpresa).
Por lo que puedo decir, el LSB 4.1 no requiere bash
y solo sh
.
Para sh
ello sigue POSIX (con una extensión menor no relevante).
bash
no siempre cumple con POSIX. solo cuando se invoca comosh
.