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
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 envalue
después de:
devuelve, no en el caso detrue
:$ 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
||:
(sin espacio) también es válido en bash. Hace lo mismo que|| :
o|| true
.