Obtengo lo que esperaba al hacer esto en bash
:
[ "a" == "a" ] && echo yes
Me dio yes
.
Pero cuando hago esto zsh
, obtengo lo siguiente:
zsh: = not found
¿Por qué el mismo comando ( /usr/bin/[
) se comporta de manera diferente en diferentes shells?
$PATH
. y==
no es unatest
sintaxis válida para/usr/bin/[
anway. Solo=
esta bien.Respuestas:
No está
/usr/bin/[
en ninguno de los depósitos. En Bash, está utilizando el comando / incorporadotest
[
, y de manera similar en zsh .La diferencia es que zsh también tiene una
=
expansión : se=foo
expande a la ruta alfoo
ejecutable. Eso significa que==
se trata de tratar de encontrar un comando llamado=
en suPATH
. Como ese comando no existe, obtienes el errorque viste (y de hecho, esto mismo sucedería incluso si realmente estuvieras usando
/usr/bin/[
).Usted puede utilizar
==
aquí si realmente quiere. Esto funciona como esperaba en zsh:porque la cita impide que se
=word
ejecute la expansión. También puede deshabilitar laequals
opción consetopt noequals
.Sin embargo, sería mejor tampoco:
=
, la prueba de igualdad compatible con POSIX ; o[[
condicionales con==
tanto golpe y zsh . En general,[[
es mejor y más seguro en todos los aspectos, incluido el evitar este tipo de problema (y otros) al tener reglas de análisis especiales en su interior.fuente
[
y[[
? (Buscar en Google solo[ vs [[
me da resultadosvs
, LOL)[[
admite una gama más amplia de pruebas en ambos casos y tiene reglas de análisis personalizadas que evitan la necesidad de citar variables, operadores, etc. Si está utilizando específicamente Bash o zsh, úselo[[
. Si está escribiendo un script portátil, escriba en el comando[
/test
comando compatible con POSIX (que puede o no ser un comando real en su sistema en ejecución).[[
allí y olvide[
existe.[[
es diferente capaz probar esto con ella:for f in *; do [ -e "$f" ] && for a in f d h p S b c; do [ "-$a" "$f" ] && for p in r w x u g; do [ "-$p" "$f" ] || p=-; a=$a$p; done && break; done && printf "%s:\t%s\n" "$a" "$f"; done
.=
/==
es sin duda uno de los casos en que[[
no es mejor que[
, como[[ a == b ]]
es lo hace "a" coincidir con el patrón "B" y no es "a" igual a "b" como era de esperar. Eso significa que necesitas escribir,[[ $a == "$b" ]]
por ejemplo. Al menos, con el[
comando, si sabe cómo funciona el análisis de comandos, sabe que debe escribirlo[ "$a" = "$b" ]
para evitar el operador split + glob como en otros comandos. Con eso en mente y si no usa -a o -o,[
es seguro en implementaciones conformes con POSIX.Y zsh y bash dan la misma respuesta (también
type
está integrado para ambos shells):fuente
[
es un comando integrado de shell en bash y en zsh:De la documentación de Shell Builtin Commands :
La documentación oficial (
$ help test
) solo permite utilizar=
:Entonces, la expresión correcta sería:
Lo que sucede es que bash es un poco menos estricto. Apoyar al
==
operador con[
parece ser una extensión bash y no se recomienda usarlo:Si desea usar
==
, debe usar la[[
palabra clave:Tenga en cuenta que
[[
es menos portátil (no es POSIX). Pero tanto bash como zsh lo admiten.fuente
En ambos shells,
bash
yzsh
, la[
utilidad es un shell incorporado. Esta es la implementación de shells de esa herramienta, se usa con preferencia al binario/usr/bin/[
. Los diferentes resultados que encuentra son causados por diferentes implementaciones.En
bash
, la[
utilidad aceptaCONDITIONAL EXPRESSIONS
como el[[
comando compuesto. De acuerdo a la página hombre bashs tanto=
y==
son válidas:En
zsh
, la[
utilidad intenta implementar POSIX y sus extensiones donde se especifican. En la especificación de la utilidad de prueba POSIX no hay un==
operador definido.fuente