Obtengo lo que esperaba al hacer esto en bash:
[ "a" == "a" ] && echo yesMe 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 unatestsintaxis 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=fooexpande a la ruta alfooejecutable. 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
=wordejecute la expansión. También puede deshabilitar laequalsopció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[/testcomando 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
typeestá 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,
bashyzsh, 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 EXPRESSIONScomo 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