¿Cuál es el programa `[` que reside en el / bin de mi sistema?

32

Recientemente estaba navegando por la /bincarpeta de mi Fedora y noté un binario llamado [. Intenté buscar en Internet más información sobre eso, pero no pude encontrar nada útil. Ejecutarlo straceno parece producir nada útil para una inspección más cercana también.

¿Que es eso? ¿Debería estar alarmado? ¿Podría ser el resultado de un compromiso del sistema? ¿Debo ejecutarlo? ¿Pertenece a algún paquete?

NlightNFotis
fuente
44
[ -f /bin/[ ] && printf "%s\n" "Don't panic"
jasonwryan
@jasonwryan Sí, me tomó un tiempo resolverlo. No pude encontrar mucha información en la red, y Google no ayudó mucho. Lo publiqué aquí con la esperanza de que pueda ayudar al próximo que esté en mi lugar.
NlightNFotis
10
¡Corre man [para ver cuál es el [comando!
Gilles 'SO- deja de ser malvado'
@Gilles Para ser honesto, lo hice y mencionó algo al respecto bash, y pensé que podría ser otra cosa. No es lo primero que se te viene a la mente cuando ves un binario con un nombre que nunca has visto antes en tu sistema de archivos, o para decirlo de otra manera, tienes que encontrar algo más concreto para despejar las dudas en tu cabeza .
NlightNFotis
44
Haga una rpm -qif /bin/[para averiguar de dónde viene ...
vonbrand

Respuestas:

37

El [binario que reside debajo del /binárbol en muchas distribuciones de GNU / Linux no es algo para alarmarse. Al menos en mi Fedora 19 es parte del paquete coreutils, como se demuestra a continuación:

$ rpm -qf /bin/[
coreutils-8.21-13.fc19.x86_64

y es un sinónimo para testpermitir expresiones como [ expression ]escribir en scripts de shell o incluso uso interactivo.

NlightNFotis
fuente
16
Tenga en cuenta que los shells como bashtienen un incorporado testy [no invocan el binario externo.
jordanm
1
@jordanm, hoy la mayoría de los proyectiles los tienen (y muchas otras operaciones simples y comunes) como componentes integrados. Pero eso no siempre fue así (o lo es en todos los shells). Incluso podría ser un mandato de POSIX.
vonbrand
2
@vonbrand pubs.opengroup.org/onlinepubs/009695399/utilities/test.html Tiene razón. [Esta especificación requiere un comando de prueba .
yegle
@vonbrand, solo los shells tipo Bourne generalmente tienen un [comando incorporado . No Bourne-como aquellos como (t)csh, rc, espor lo general no lo hacen ( fishes una excepción allí).
Stéphane Chazelas
5

El [comando es el mismo que el testcomando.

Le permite escribir declaraciones condicionales más bien concisas en scripts de shell. Desde la página del manual de SunOS:

   if [ "$1" = "pear" ] || [ "$1" = "grape" ] || [ "$1" = "apple" ]
   then
       command
   fi

Si lo elimina, ¡los scripts se romperán!

Thorbjørn Ravn Andersen
fuente
Las secuencias de comandos escritas para shells que no tienen [un comando incorporado se romperán. La mayoría de las conchas lo hacen. Aún así, ciertamente no recomendaría eliminar /bin/[.
Keith Thompson
@KeithThompson, todos los shells tienen [incorporados, son scripts que ejecutan aplicaciones [que no son shell que se romperán. Me gusta find ... -exec [ -f {} ] \;oenv LC_ALL=C [ -f bar ]
Stéphane Chazelas
@StephaneChazelas: ¿ Todas las conchas? (csh y tcsh no lo hacen, pero tal vez eso no viene al caso). No creo haber visto un shell derivado de sh que no tiene [una función incorporada, pero no creo que haya [sido una función incorporada en el original Bourne shell. En cualquier caso, eliminar /bin/[sería una mala idea.
Keith Thompson
Pequeñas objeciones: testy [son casi lo mismo. [requiere un cierre ]; testno lo permite (o más bien no trata un argumento de forma ]especial).
Keith Thompson
2

El [siempre se da como un equivalente a la prueba, pero no había visto el] mencionado explícitamente, aunque siempre está ahí. Acabo de encontrar esto en http://ss64.com/bash/test.html :

When the [ form is used, the last argument to the command must be a ]

lo cual es tranquilizador, por fin tengo finalización como dicen.

Harry Weston
fuente