2010-01-04 10 views
8

Cuál es la diferencia entre test -L filename y test -h filename en ksh shell. Desde la página del manual, ambos se usaron para identificar un enlace simbólico, pero quiero saber la diferencia exacta.Diferencia entre prueba -h y prueba -L

Aquí está la descripción de la página de manual.

-h file     True if file exists and is a sym- 
         bolic link. 
-L file     True if file exists and is a sym- 
         bolic link. 

Respuesta

15

El código fuente para ksh93, en el archivo bltins/test.c, muestra que estas dos opciones son tratados exactamente igual, excepto para las esperanzas del autor para el futuro:

 case 'L': 
     case 'h': /* undocumented, and hopefully will disappear */ 
      if(*arg==0 || arg[strlen(arg)-1]=='/' || lstat(arg,&statb)<0) 
        return(0); 
      return(S_ISLNK(statb.st_mode)); 

De esto concluyo que se comportan exactamente el Lo mismo, pero -h es una opción heredada y puede desaparecer un día :-)

+1

Aprecio la manera de responder mi pregunta. –

7

Parece que ambos existen por razones de herencia, para ser compatibles entre las diferentes versiones de Unix. Debería poder utilizar cualquiera de ellos, ya que hacen exactamente lo mismo, pero tenga en cuenta que si el sistema en el que se está ejecutando no cumple con los estándares más recientes, es posible que le falte uno u otro.

Ambas formas están presentes en el Single Unix Specification version 3/POSIX 2004, sin salvedades:

-h   ruta
True si ruta resuelve en un archivo que existe y es un enlace simbólico . False si nombre de ruta no se puede resolver, o si nombre de ruta se resuelve en un archivo que existe pero que no es un enlace simbólico. Si el componente final de ruta nombre es un enlace simbólico , no se sigue ese enlace simbólico.
-L   ruta
True si ruta se resuelve en un archivo que existe y es un enlace simbólico. False si nombre de ruta no se puede resolver, o si nombre de ruta se resuelve en un archivo que existe pero que no es un enlace simbólico. Si el componente final de ruta nombre es un enlace simbólico , no se sigue ese enlace simbólico.

De acuerdo con la página test(1) hombre en Mac OS X y FreeBSD (tenga en cuenta que esta advertencia puede ser obsoleta, sino que first appeared in NetBSD in 1996):

 
    -h file  True if file exists and is a symbolic link. This operator 
        is retained for compatibility with previous versions of 
        this program. Do not rely on its existence; use -L instead. 

Y al parecer, some versions of Solaris test sólo soportan -h, y (de nuevo en 2003) some software has switched to -h por razones de compatibilidad, por lo que -h puede ser su mejor opción.

+0

'No confíe en su existencia; use -L en su lugar '¿Está escrito en la página del manual –

+1

? Sí, lo cité directamente desde la página del manual en mi respuesta para señalarlo. –

+0

Tenga en cuenta que después de algunas investigaciones adicionales, esa línea en la página 'man' es bastante antigua y puede estar desactualizada. –

1

página del manual de Fedora dice

-h FILE 
      FILE exists and is a symbolic link (same as -L) 
2

No hay diferencia, son exactamente lo mismo. Probablemente existen para unificar diferentes pruebas implementaciones pre-POSIX.

Cuestiones relacionadas