Cuál es más idiomático en un script bash: `|| verdadero` o `|| : `?

No hago demasiadas secuencias de comandos de shell, por lo que me sorprendió un poco cuando estaba leyendo la documentación de git submodule y vi la sintaxis que usaban en esta documentación:

A El retorno distinto de cero del comando en cualquier submódulo hace que el procesamiento finalice. Esto se puede anular agregando || : al final del comando.

Tuve que buscar que || : era una forma abreviada de forzar a un comando a salir correctamente. Cada vez que tuve que hacer que un comando saliera correctamente , Utilicé || true. ¿Se considera que || : es más idiomático?

Comentarios

  • Es ' s vale la pena señalar que ||: (sin espacio) también es válido en bash. Hace lo mismo que || : o || true.

Responder

true no estaba integrado en el shell Bourne. : siempre lo fue (era la forma de ingresar comentarios antes de que se presentara #).

Eso, y porque es más corto de escribir es probablemente la razón principal por la que la gente prefiere : sobre true.

Note otra diferencia en Shell POSIX (para bash, solo en modo POSIX): mientras que true es una función incorporada normal (ni siquiera tiene que estar incorporada) , : es un especial incorporado. Eso tiene algunas implicaciones, la mayoría de las cuales es poco probable que tengan algún impacto en este caso particular:

  • Si un comando : falla, incluso debido a una redirección fallida, que hace que el shell se cierre. En la práctica, eso probablemente no hará una diferencia a menos que pase redirecciones a :

    $ sh -c ": > / ; echo HERE" sh: 1: cannot create /: Is a directory $ sh -c "true > /; echo HERE" sh: 1: cannot create /: Is a directory HERE 
  • en var=value :, var permanece configurado en value después de : devuelve, no en el caso de true:

    $ var=1; var=2 : ; echo "$var" 2 $ var=1; var=2 true; echo "$var" 1 

Tenga en cuenta también que || true funciona en shells de rc y csh familias, pero no || : (pero no para cancelar set -e en csh).

|| : no es lo mismo que :. Significa o ejecutar : de lo contrario (es decir, si la canalización anterior falla).

set -e false 

Causaría que el shell saliera debido a set -e (también conocida como la opción errexit) y tiene un estado de salida (fallo) distinto de cero. El efecto set -e se cancela si el comando que devuelve un estado de salida distinto de cero se utiliza como una condición como en:

if false; then ... while false; do ... false && : ... false || : ... 

false && : solo cancela set -e. false || : cancela el efecto de set -e y establece el estado de salida en 0 por lo que es más idiomático decir que queremos ignorar un código de salida de falla del comando. La mayoría diría que || true es más legible (transmite la intención con mayor claridad).

Comentarios

  • && : es brillante, ¿hay algún documento o lectura adicional sobre esto? Google se queda corto al intentar encontrar este tipo de palabras clave …

Respuesta

La mayoría de estas respuestas no abordar el uso más común de :.

Primero, esta discusión no está relacionada con ningún shell que no sea un Bourne shell (sh) derivado. Dicho esto, todos los shells derivados de Bourne ven true y : como lo mismo. Se solía animar a los programadores a utilizar : en lugar de true, porque : siempre es un integrado, mientras que solía haber casos en los que true no siempre era un elemento integrado.

: tiene dos usos. No es un sinónimo de #, pero tiene una función diferente. Al depurar su secuencia de comandos en un set -x, el analizador descarta las líneas donde se usa # y las ignora por completo, mientras que las líneas con : se analizan y evalúan. Esto es realmente útil en la depuración ya que en -x se muestran esas líneas y su valor después de la evaluación.Es como poner print declaraciones en su código que solo se muestran en el modo -x. Tenga cuidado con los valores después de : ya que son código real y los efectos secundarios pueden afectar su programa.

Comentarios

  • ¿Cuál es el segundo uso?

Responder

Generalmente, en bash, el colon : y true es equivalente.

Is | | : ¿se considera más idiomático?

Creo que se basa en el context .

Si quieres un return value, o un condition siempre es cierto , debe usar la palabra clave true, hará que su código sea más claro y permitirá que los espectadores sepan que desea enfatizar el valor true , es decir:

while true; do something 

o

<commnad> RETURN_VALUE= $? || true 

Y si desea no haga nada , o NOP en shell, debe usar dos puntos :

if condition then : # DO NOTHING HERE else do something fi 

o

while conditon do : # DO NOTHING HERE done 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *