Siempre me sorprende que en la carpeta /binhaya un [programa.
¿Es esto lo que se llama cuando estamos haciendo algo como if [ something ]:?
Al llamar al [programa explícitamente en un shell, solicita un correspondiente ], y cuando proporciono el corchete de cierre parece que no hace nada, sin importar lo que inserte entre los corchetes.
No hace falta decir que la forma habitual de obtener ayuda sobre un programa no funciona, es decir, man [ni [ --helpfunciona.

[refiere altestcomando, noexpr, así que debería serloman testman '['funciona bien para mí, ya sea que olvidó citar[o tiene una definición diferente de "obras".[evalúa sus argumentos, por lo que debe tener espacios entre todos ellos.[ a=b ]no es una comparación: siempre será verdadero (es una sola cadena: "a = b", que siempre se evalúa como verdadera ) Y debe limitar el número de argumentos a 4 (aunque las implementaciones recientes permitirán más ... . limitar a 4 lo hace más portátil. Por ejemplo:[ "a" = "b" ]ya tiene 4 argumentos: "a" "=" "b" y el final no necesario de la prueba arg: "]"). Si necesita más: pruebas de cadena con, por ejemplo:if [ "$Var_a" = "foo" ] && [ "$Var_b" = "bar" ] ; then : do something ; fi!por sí mismo (sin escapes y sin comillas) no será reemplazado, y aún mejor seríaif ! [ .... Todas las expansiones de bash que usan!incluyen al menos otros personajes[-builtin enbash(y posiblemente también otros depósitos), y que se puede usar en lugar de/bin/[. También está eltestcomando, que en muchos sistemas es un enlace simbólico/bin/[(o viceversa), pero en otros es un comando separado.Respuestas:
El
[trabajo del comando es evaluar las expresiones de prueba. Regresa con un estado de salida 0 (que significa verdadero ) cuando la expresión se resuelve en verdadero y otra cosa (que significa falso ) de lo contrario.No es que no haga nada, es solo que su resultado se encuentra en su estado de salida. En un shell, puede averiguar sobre el estado de salida del último comando en los
$?shells tipo Bourne o$statusen la mayoría de los otros shells (fish / rc / es / csh / tcsh ...).En otros idiomas como
perl, el estado de salida se devuelve, por ejemplo, en el valor de retorno desystem():Tenga en cuenta que todos los shells modernos tipo Bourne (y
fish) tienen un[comando incorporado . La de/binque por lo general sólo se ejecutará cuando se utiliza otro shell o cuando haces cosas comoenv [ foo = bar ]ofind . -exec [ -f {} ] \; -printo queperlcomando anterior ...El
[comando también se conoce por eltestnombre. Cuando se llama comotest, no requiere un]argumento de cierre .Si bien es posible que su sistema no tenga una página de manual
[, probablemente tenga una paratest. Pero nuevamente, tenga en cuenta que documentaría la implementación/bin/[o/bin/test. Para saber acerca de la[construcción en su shell, debe leer la documentación de su shell.Para obtener más información sobre el historial de esa utilidad y la diferencia con la
[[...]]expresión de prueba ksh, es posible que desee echar un vistazo a estas otras preguntas y respuestas aquí .fuente
[. No recuerdo si era una variante de Bourne o una versión antigua de ceniza.[ytestcomo builtins con Unix System III. Antes de eso, no había[ytestsolo había un comando binario externo.find . -exec [ f {} ] \; -print? El comandofind . -type f -printharía lo mismo de manera mucho más eficiente ...Tienes razón en sorprenderte. Ese es uno de los raros comandos POSIX, con la utilidad nula (
:), que no respeta la convención de caracteres permitidos del archivo de comandos (juego de caracteres de nombre de archivo portátil).Precisamente, pero se puede usar sin el
iftambién.No hace nada visible, pero en realidad hace lo mismo que cuando se usa
if, es decir, establece el estado de salida en 0 (verdadero) o cualquier otra cosa (falso) dependiendo de lo que ponga dentro de los corchetes. Es (por una razón) el mismo comportamiento que eltestcomando; La única diferencia es que busca el final]. Verman testpara más detalles.Eso depende de su sistema operativo.
man [definitivamente funciona para mí en un par de distribuciones principales de Gnu / Linux, pero no funciona en Solaris.[ --helppodría funcionar o no dependiendo de la implementación ya que de todos modos está rompiendo la sintaxis, perdiendo el final]. Por otra parte, el estándar POSIX para eltest/[comando excluye explícitamente todas las opciones, incluyendo la--opción de terminación por lo tanto[ --help ]ytest --helpnecesidad de volvertruey estar en silencio por diseño. Tenga en cuenta que lo que se pone dentro de los corchetes o después[y que se parecen a las opciones (por ejemplo-f file,-n string, y los gustos) no son opciones pero operandos .Todos los modernos intérpretes de concha estilo Bourne (como
bash,ksh,dashyzshpara nombrar unos pocos) implementan eltest/[utilidad internamente como una orden interna de modo que cuando usted los usa, la página Man adecuada para referirse a que podría ser la una de la cáscara, no eltestuno.Antes de Unix System III (1981), el shell Bourne no implementaba la
testutilidad como incorporada, por lo que solo estaba disponible la implementación del comando binario externo. No había un[comando (interno o integrado) hasta Unix System III, por lo que, por ejemplo, en la Versión 7 de Unix, tenía que escribir:en lugar de:
fuente
man testfunciona pero no ¡man [Por otro lado, mi entorno cygwin sí lo sabeman [!man [no parece funcionar en Manjaro (basado en Arch Linux). El manual detestlistas[ --helpcomo una invocación válida que debería mostrar ayuda, pero curiosamente no lo hace, y en cambio se queja de una falta], al igual que con--version. Agregar el]no hace nada, por lo que parece imposible obtener ayuda que no sea deman test./usr/bin/[ --helpo/bin/[ --help.env [ --helpasí como/usr/bin/[ --helptrabajar completamente bien (aunque necesito citar/usr/bin/[o zsh se queja).[en realidad se conoce más comúnmente comotestcomando. El uso típico de este comando es simplemente evaluar expresiones y devolver su condición, verdadera o falsa. A menudo se usa enif-then-else-fideclaraciones, aunque se puede usar fuera de lasifdeclaraciones para ejecutar condicionalmente otros comandos a través de shell&&u||operadores, por ejemplo.Más específicamente, la evaluación se comunica a otros comandos a través del estado de salida. Algunos programas pueden optar por mostrar el estado de salida para indicar diferentes tipos de eventos: el programa se completa con éxito, se produce un error de tipo particular durante la ejecución o errores de sintaxis. En el caso del
testcomando, hay0significa verdadero y1significa falso. Como señaló Stephan, los errores de sintaxis producen el estado de salida de2.Su ubicación depende de su sistema, y también explica por qué no vio la página de manual cuando lo hizo
man [. Por ejemplo, en FreeBSD está debajo/bin. En Linux (o en mi caso particular, Ubuntu 16.04) está en/usr/bin/. Si lo haceman [oman testen un sistema Linux, verá la misma documentación abierta. También es importante tener en cuenta que su shell puede tener su propia implementación detest.También debe tenerse en cuenta que este comando tiene problemas que la implementación de Korn Shell (comúnmente conocida como referencia de "expresión condicional" con corchetes dobles
[[ "$USER" = "root" ]]) busca resolver. Esta característica también es utilizada por otros shells comobashyzsh.fuente
/usr/bin/para Amazon Linux también.En algunas distribuciones (por ejemplo, Ubuntu),
man [sigue un enlace simbólico atest(1). En otros (por ejemplo, Arch), este no es el caso. (Pero latestpágina del manual también documenta el uso[)type -a [le muestra que hay un shell integrado y un ejecutable.bash-builtin
[ --helpsolo imprime un mensaje de error. (Pero como es una función integrada, puede usarhelp [o mirar la página / documentos de bash man)./usr/bin/[ --helpimprime la salida de ayuda completa (para la versión GNU Coreutils), que comienza con:y luego describe la sintaxis permitida para EXPRESSION.
Esta es otra forma en que podría haber descubierto eso
[ytestson equivalentes.Por cierto, si está programando para bash (o escribiendo frases interactivas), recomendaría en
[[lugar de hacerlo[. Es mejor de varias maneras, vea los enlaces en la respuesta de Serg.fuente
[El comando devuelve el estado de salida cero si la expresión, contenida en sus argumentos, se considera verdadera y el estado de salida distinto de cero si la expresión, contenida en sus argumentos, se considera falsa. También falla con el mensaje de error si su último argumento no lo es](esto se hace únicamente por razones estéticas).P.ej:
... dará salida:
Sin embargo, bash y muchos otros shells generalmente no invocan
/bin/[(o/usr/bin/[) en estos casos, sino que llaman al comando incorporado con exactamente el mismo comportamiento (solo por razones de rendimiento). Para invocar/bin/[(no el sustituto incorporado del shell) debe especificar explícitamente su ruta (p/bin/[ hello ].]Ej ., No necesita prefijar con dirname aunque ☺ ), o configurar el shell para que no use un sustituto incorporado (por ejemplo,enable -n [en bash).PD: Como se dijo en otras respuestas,
[está relacionado contest. Perotest, a diferencia[, no requiere]como último argumento (y no lo espera en absoluto; agregar más]a lostestargumentos puede hacer que falle con un mensaje de error o que devuelva un resultado incorrecto) . El/bin/testy/bin/[puede resolverse en el mismo archivo (p. Ej., Uno está enlazado a un enlace simbólico ; en este caso, el desvío de comportamiento probablemente se implementa analizando el comando actualmente llamado dentro del propio códigotest/[) o en diferentes archivos. Paratest, el shell también generalmente invoca un sustituto incorporado, a menos que la ruta se especifique explícitamente (/bin/test) o esté configurada para no hacerlo (enable -n test)PPS: a diferencia de
testy[, modernoifnunca es un archivo real. Es parte de la sintaxis de shell (por ejemplo, bash):if commandA; then commandB; fi(se pueden usar nuevas líneas en lugar de punto y coma) hacecommandBque se ejecute si y solo sicommandAsale con estado cero. Esto se adapta perfectamente al comportamiento detesto[, lo que permite combinarlos comoif [ "$a" = foo ]; then …; fi(oif test "$a" = foo; then …; fi, simplemente, menos legibles) . Sin embargo, los scripts modernos a menudo usan en[[lugar detesto[, que (como elif) nunca es un archivo real, sino que siempre es parte de la sintaxis de shell.PPPS: En cuanto a
man, nunca esperemantener un artículo sobre cada comando en su sistema de archivos. Información sobre algo de información (incluso "real", basada en archivos) comandos pueden faltar, en algunos shell empotrados puede estar presente no sólo en un artículo dedicado a la cáscara específica (que es el lugar en el que sin duda encontrará información sobretest,[,if,[[). Aún así, muchas distribuciones tienen artículos explícitosmanparatesty[. (Acerca de--help, no se reconocetestpor razones obvias: necesita manejar en silencio casos comoa=--help; test "$a"; en algunas distribuciones[ --help(sin cerrar]) todavía muestra ayuda, en algunos no lo hace).fuente
ifera un comando hasta Unix V6. Unix V7 (1979) vino con el shell Bourne (con suif-then-else-ficonstrucción) y el nuevotestcomando.