Encontré algo extraño en bash y no puedo entender cómo funciona.
[test ~]$ a="" [test ~]$ $a && echo 1 1 [test ~]$ $a [test ~]$ echo $? 0 ¿Por qué $a (que está vacío) devuelve 0? ¿Se transforma de alguna manera en un comando vacío? Si agrego comillas o escribo una cadena vacía antes de && , devolverá un error. Mientras que el comando vacío devuelve 0.
[test ~]$ "$a" && echo 1 -bash: : command not found [test ~]$ "" && echo 1 -bash: : command not found [test ~]$ `` && echo 1 1Entonces, ¿qué sucede cuando escribo $a?
Parece que confundes bash con algún otro lenguaje de programación. Las variables se reemplazan, luego se ejecuta lo que queda.
"$a" Este es el contenido de a , entre comillas. a está vacío, por lo que esto es equivalente a:
"" Eso no es un comando. "Comando no encontrado." Como hubo un error, la ejecución no tuvo éxito (el código de retorno del shell no es 0), por lo que la segunda mitad del comando, && echo 1 , no se ejecuta.
comillas...
`` ... ejecutar lo que sea que haya entre ellos, con la salida de ese comando reemplazando toda la construcción. (También hay $() que hace lo mismo y es menos probable que se pase por alto en un script). Entonces...
`echo "foo"`...evaluaría a...
foo...que luego sería ejecutado. Entonces tus...
``...evalúa a...
<empty>... que luego se "ejecuta con éxito" (ya que no hay error).
Si desea probar el contenido de a y ejecutar echo 1 solo si a no está vacío, debe usar el comando de test :
test -n "$a" && echo 1 Hay un alias conveniente para test , que es [ , que también ignora convenientemente un final ] ...
[ -n "$a" ] && echo 1 ...y un bash-ismo [[ que "sabe" sobre el reemplazo de variables y, por lo tanto, no necesita comillas para evitar quejarse de un argumento faltante si $a efectivamente se evalúa como vacío...
[[ -n $a ]] && echo 1...o, por supuesto, el más detallado...
if [[ -n $a ]] then echo 1 fiah Se perdió la parte central de la pregunta:
$a && echo 1 Estas son dos declaraciones, separadas por && . La segunda declaración solo se ejecuta si la primera se ejecuta correctamente. El bash separa la línea y ejecuta la primera declaración:
$aEste es...
<empty>... que es "exitoso", por lo que se ejecuta la segunda declaración. En contra de eso...
&& echo 1... es un error de sintaxis porque no hay una primera declaración . ;-) (Complicado, lo sé, pero así es como se desmorona esta galleta).
a=""o
a=" " #a long empty stringentonces
$> $adevolverá 0
$> $noExistVartambién devolverá 0.
Se "ejecutan", de hecho, no se ejecuta nada. al igual que presiona enter o presiona 10 espacios y luego ingresa, también obtiene el código de retorno 0.
$> && echo 1esto fallará, porque bash intentará ejecutar la primera parte, en este caso falta.
$> $notExistVar && echo 1 Aquí funciona, supongo que bash encontró la primera parte $whatever , por lo tanto, no hay error de sintaxis. Luego "ejecútelo", bueno, nada que ejecutar, devuelva 0, (lo mismo que presionar enter después del indicador), luego verifique, si la primera parte devolvió 0, ejecute el cmd después de && .
Dije adivinar porque no revisé los códigos fuente de bash. Por favor corrígeme si está mal.
el caso $> " " && echo 1 , creo que está claro, no es necesario explicarlo.