`test` y` [`- diferentes binarios, ¿alguna diferencia?

13

Me di cuenta al responder otra pregunta que testy [son diferentes binarios, pero la [página de manual se detiene test's. Además del requisito de un final ], ¿hay alguna diferencia? Si no, ¿por qué son binarios separados en lugar de estar vinculados? (También son bashincorporados, y bashtampoco muestra una diferencia).

Kevin
fuente

Respuestas:

4

El código fuente explica la diferencia de cómo maneja la --helpopción.

  /* Recognize --help or --version, but only when invoked in the
     "[" form, when the last argument is not "]".  Use direct
     parsing, rather than parse_long_options, to avoid accepting
     abbreviations.  POSIX allows "[ --help" and "[ --version" to
     have the usual GNU behavior, but it requires "test --help"
     and "test --version" to exit silently with status 0.  */

Demostrando

$ /usr/bin/test --help
$
$ /usr/bin/[ --help
Usage: test EXPRESSION
  or:  test
  or:  [ EXPRESSION ]
  or:  [ ]
  or:  [ OPTION
Exit with the status determined by EXPRESSION.
[...]

En la bashversión incorporada, la única diferencia es que [requiere ]al final, como dijiste.

Mikel
fuente
1
Interesante, aunque la mayoría de los programas logran el mismo comportamiento con un enlace simbólico.
Kevin
1
Son enlaces duros al mismo inodo en mi sistema. El beneficio de esto sobre los enlaces simbólicos es que si el objetivo del enlace simbólico se elimina o mueve, el enlace simbólico ya no funciona. Si uno de los enlaces duros a un inodo se mueve o se elimina, todos los enlaces duros continúan funcionando.
Andrew Medico
5

Normalmente, son el mismo binario con enlaces duros. Dependiendo del shell, se puede usar una implementación interna para testy [pruebas en lugar del binario. Esto es más eficiente en términos de generación de procesos y puede proporcionar opciones diferentes a las que testofrece el programa binario .

Además de las diferencias en el formato de llamada, ambos proporcionan la misma funcionalidad.

BillThor
fuente
77
Sorprendentemente, en los coreutils de Debian no son el mismo binario. La misma fuente se compila dos veces, una define PROGRAM_NAME como "prueba", y otra la define como "[" y con algún código adicional para probar que la expresión termina con "]". o_O
angus
3
@angus Otro ejemplo de esto es ls / dir / vdir. A Coreutils parece gustarle construir diferentes binarios codificados en lugar de probar argv [0] en tiempo de ejecución.
Random832