Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

193
Vistas
Comprender el cortocircuito de Bash

En primer lugar, no soy un profesional de Bash. Descubrí hace unos meses que si uso tanto && como || operadores de cortocircuito en secuencia con llaves, entonces, en caso de que la primera declaración salga con un valor verdadero, si la última declaración en el bloque verdadero sale distinto de cero, entonces el bloque fallido también se ejecutará. Me gusta esto:

 returnNumber 0 && { echo 'OK' returnNumber 1 } || { echo 'NG' }

Saldrá:

 OK NG

Entonces, busqué la solución más fácil para esto y se me ocurrió esto:

 returnNumber 0 && { echo 'OK' returnNumber 1 : } || { echo 'NG' }

Lo sé, es fácil omitir el colon incorporado, pero ¿es una forma adecuada de solucionarlo?

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Esto es en realidad una trampa Bash muy común. No es un error.

returnNumber 0 evalúa como verdadero, por lo que el segundo bloque (unido por lógico y && ) también se evalúa para asegurarse de que el resultado del first && second siga siendo verdadero.
El segundo bloque genera OK pero se evalúa como falso, por lo que ahora el resultado del first && second es falso. Esto significa que la tercera parte (unida por lógica o || ) también debe evaluarse, lo que hace que también se muestre NG .


En lugar de depender de && y || , deberías usar sentencias if :

 if returnNumber 0; then echo 'OK' returnNumber 1 else echo 'NG' fi

tl; dr: nunca use x && y || z cuando y puede devolver un estado de salida distinto de cero.

over 4 years ago · Santiago Trujillo Denunciar

0

El Sr. Llama ya respondió correctamente la pregunta, esto solo para una referencia rápida de lo que sucede con las diferentes "combinaciones". El cmd0 es un "comando" con estado de salida cero y el cmd1 es distinto de cero.

 cmd0() { echo -n "[$@-0]"; return 0; } cmd1() { echo -n "[$@-1]"; return 1; } second() { echo "[second]"; } doit() { echo "case: $@"; eval "$@"; echo; } doit 'cmd0 start && cmd0 first && second' doit 'cmd0 start && cmd0 first || second' doit 'cmd0 start || cmd0 first && second' doit 'cmd0 start || cmd0 first || second' doit 'cmd0 start && cmd1 first && second' doit 'cmd0 start && cmd1 first || second' doit 'cmd0 start || cmd1 first && second' doit 'cmd0 start || cmd1 first || second' doit 'cmd1 start && cmd0 first && second' doit 'cmd1 start && cmd0 first || second' doit 'cmd1 start || cmd0 first && second' doit 'cmd1 start || cmd0 first || second' doit 'cmd1 start && cmd1 first && second' doit 'cmd1 start && cmd1 first || second' doit 'cmd1 start || cmd1 first && second' doit 'cmd1 start || cmd1 first || second'

produce:

 case: cmd0 start && cmd0 first && second [start-0][first-0][second] case: cmd0 start && cmd0 first || second [start-0][first-0] case: cmd0 start || cmd0 first && second [start-0][second] case: cmd0 start || cmd0 first || second [start-0] case: cmd0 start && cmd1 first && second [start-0][first-1] case: cmd0 start && cmd1 first || second [start-0][first-1][second] case: cmd0 start || cmd1 first && second [start-0][second] case: cmd0 start || cmd1 first || second [start-0] case: cmd1 start && cmd0 first && second [start-1] case: cmd1 start && cmd0 first || second [start-1][second] case: cmd1 start || cmd0 first && second [start-1][first-0][second] case: cmd1 start || cmd0 first || second [start-1][first-0] case: cmd1 start && cmd1 first && second [start-1] case: cmd1 start && cmd1 first || second [start-1][second] case: cmd1 start || cmd1 first && second [start-1][first-1] case: cmd1 start || cmd1 first || second [start-1][first-1][second]
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda