Siempre me sorprende que en la carpeta /bin
haya 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 [ --help
funciona.
[
refiere altest
comando, noexpr
, así que debería serloman test
man '['
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á eltest
comando, 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$status
en 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/bin
que por lo general sólo se ejecutará cuando se utiliza otro shell o cuando haces cosas comoenv [ foo = bar ]
ofind . -exec [ -f {} ] \; -print
o queperl
comando anterior ...El
[
comando también se conoce por eltest
nombre. 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.[
ytest
como builtins con Unix System III. Antes de eso, no había[
ytest
solo había un comando binario externo.find . -exec [ f {} ] \; -print
? El comandofind . -type f -print
harí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
if
tambié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 eltest
comando; La única diferencia es que busca el final]
. Verman test
para 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.[ --help
podrí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 --help
necesidad de volvertrue
y 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
,dash
yzsh
para 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 eltest
uno.Antes de Unix System III (1981), el shell Bourne no implementaba la
test
utilidad 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 test
funciona pero no ¡man [
Por otro lado, mi entorno cygwin sí lo sabeman [
!man [
no parece funcionar en Manjaro (basado en Arch Linux). El manual detest
listas[ --help
como 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/[ --help
o/bin/[ --help
.env [ --help
así como/usr/bin/[ --help
trabajar completamente bien (aunque necesito citar/usr/bin/[
o zsh se queja).[
en realidad se conoce más comúnmente comotest
comando. 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-fi
declaraciones, aunque se puede usar fuera de lasif
declaraciones 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
test
comando, hay0
significa verdadero y1
significa 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 test
en 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 comobash
yzsh
.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 latest
página del manual también documenta el uso[
)type -a [
le muestra que hay un shell integrado y un ejecutable.bash-builtin
[ --help
solo 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/[ --help
imprime 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
[
ytest
son 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 lostest
argumentos puede hacer que falle con un mensaje de error o que devuelva un resultado incorrecto) . El/bin/test
y/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
test
y[
, modernoif
nunca 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) hacecommandB
que se ejecute si y solo sicommandA
sale con estado cero. Esto se adapta perfectamente al comportamiento detest
o[
, 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 detest
o[
, que (como elif
) nunca es un archivo real, sino que siempre es parte de la sintaxis de shell.PPPS: En cuanto a
man
, nunca espereman
tener 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ícitosman
paratest
y[
. (Acerca de--help
, no se reconocetest
por 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
if
era un comando hasta Unix V6. Unix V7 (1979) vino con el shell Bourne (con suif-then-else-fi
construcción) y el nuevotest
comando.