function foo {
(cd $FOOBAR;
<some command>
if [$? -ne 0]
then
echo "Nope!"
else
echo "OK!"
fi
)
}
Estoy tratando de escribir una función como la de arriba y colocarla en mi archivo .bashrc. Después de obtener el archivo y ejecutarlo, obtengo:
Tiempo total: 51 segundos -
golpe: [1: comando no encontrado
¡OK!
¿Alguien puede ayudarme a entender lo que hice mal?
$?
es igual a 0 con unaif
instrucción no tiene sentido,if
espera un comando y si dicho comando regresa0
, ejecuta el código en el bloque. entonces seif true; then echo hello; fi
hará eco desde que el comandotrue
regresó0
.$?
mantiene el estado de la última tubería , que no es el comandotest
([
) en laif
declaración. El ejemplo es probar sisome command
fue exitoso. Puede hacer lo mismo con&&
y||
, pero puede hacer líneas largas e ilegibles en comparación conif [ $? -eq 0 ]
. El mismo argumento esif some command
$?
expande, estoy señalando que no tiene sentidotest
ser utilizado; ya queif some command
hace lo mismo con una declaración versus tener dos declaraciones separadas. si el comando ya es largo, agregar tres caracteres más no haría que lo 'ilegible' sea terriblemente más 'ilegible'.Respuestas:
Agregue un espacio después del
[
, y otro antes]
:[
es una orden interna del shell, es un comando al igual queecho
,read
,expr
... necesita un espacio después de ella, y requiere una coincidencia]
.La escritura
[ $? -ne 0 ]
es en realidad invocando[
y dándole 4 parámetros:$?
,-ne
,0
, y]
.Nota: el hecho de que recibas un mensaje de error
[1: command not found
significa que$?
estaba teniendo el valor de1
.fuente
[
es un enlacetest
también[
es una concha incorporada, y/usr/bin/[
rara vez se usa.O podrías saltarte por
$?
completo. Si su comando escmd
, lo siguiente debería funcionar:fuente
Es una buena práctica asignar el valor de retorno a una variable antes de usarla.
Le permite reutilizar el valor de retorno. por ejemplo, en una declaración if ... elif ... else ...
fuente
[
(sin el espacio, se convierte en un error de sintaxis enbash
) Se deshará si edita y corrige su error.$?
directamente porque eso se romperá si alguna vez, al editar el script más adelante, coloca una línea entre el comando y el$?
cheque.La única razón por la que desea usar
$?
como argumentos para un[
comando (si ese[
comando se ejecuta en la condición de unaif
declaración o no) es cuando desea discriminar en un estado de retorno específico, como:La sintaxis para todos aquellos
if
,while
,until
... declaraciones esQue se ejecuta
cmd-list2
sicmd-list1
tiene éxito ocmd-list3
no.El
[ "$?" -eq 0 ]
comando es un no-op. Se establece$?
en 0 si$?
es 0 y$?
en no cero si no era cero.Si quieres ejecutar algo si
cmd
falla, es:En general, no es necesario jugar con
$?
mucho menos saber qué valor significatrue
ofalse
. Los únicos casos son como dije anteriormente si necesita discriminar un valor específico, o si necesita guardarlo para más adelante (por ejemplo, para devolverlo como el valor de retorno de una función) como:También recuerde que dejar una variable sin comillas es el operador split + glob. No tiene sentido invocar a ese operador aquí, por lo que debería ser:
no
, y mucho menos[ $? -ne 0 ]
(que solo invocaría el[$? -ne 0 ]
[
comando si$IFS
contiene el primer carácter de$?
).También tenga en cuenta que la forma Bourne de definir una función es quedarse
function-name()
delante de un comando. Ese es el caso en cada Bourne shell como excepciónbash
yyash
(y versiones recientes deposh
), que sólo permite un comando compuesto (comandos compuesto que está siendo{...}
o(...)
o cosas comofor...done
,if...fi
...function foo { ... }
es laksh
sintaxis de definición de función. No hay razón por la que quieras usarlo aquí.Su código puede escribirse de forma portátil (POSIXY):
También tenga en cuenta que
cd
sin-P
tiene un significado muy especial (maneja rutas que contienen..
componentes de manera diferente a cualquier otro comando), por lo que es mejor incluirlo en los scripts para evitar confusiones.(esa función devuelve
false
sicd
falla, pero no si<some command>
falla).fuente
Creo que el siguiente comando hará todo lo que quieras en una línea.
fuente