Sintaxis poco conocida de bash.
Si tu escrí toma un parámertro y querés que pueda tener un defól, hacé así.
$TIMEOUT=${1:-5}
watch -n $TIMEOUT -d ls -l
En este caso, tu escrí va a tomar el TIMEOUT del primer parámetro ($1) pero si $1 es nulo, tomará valor 5.
man bash:
${parameter:-word}
Use Default Values. If parameter is unset or null, the expansion of word is substituted. Otherwise, the value of parameter is substituted.
Más info en la parte Parameter Substitution del bash.
viernes, 20 de agosto de 2010
Enconchalo
Truco feliz:
Normalmente uno quiere ver lo que hará un script antes de ejecutarlo.
Normalmente uno hace:
$ echo rm *partial*
(revisa)
$ rm *partial*
pero hay una forma que a mí me da mucho más placer:
$ echo rm *partial*
(reviso)
$ echo rm *partial*|sh
Y ahorro muchos keystrokes!
Normalmente uno quiere ver lo que hará un script antes de ejecutarlo.
Normalmente uno hace:
$ echo rm *partial*
(revisa)
$ rm *partial*
pero hay una forma que a mí me da mucho más placer:
$ echo rm *partial*
(reviso)
$ echo rm *partial*|sh
Y ahorro muchos keystrokes!
martes, 3 de agosto de 2010
El error se atranca en el caño
Muchas veces queremos ejecutar un comando únicamente si el anterior fue exitoso:
o incluso mejor:
Pero a veces tenemos un pipeline:
El problema acá es que el error code de unit_test se pierde, y el "&&" utiliza el error code del grep, que no es lo que queremos.
Pues bien. Hoy descubrí (should RTFM more often) que existe una variable PIPESTATUS que guarda todos los error codes de todo el pipeline:
Esta variable es un array que guarda un error code por cada comando en el pipe.
if unit_test
then
vim result.log
fi
o incluso mejor:
unit_test && vim result.log
Pero a veces tenemos un pipeline:
unit_test | grep -v Time && vim result.log
El problema acá es que el error code de unit_test se pierde, y el "&&" utiliza el error code del grep, que no es lo que queremos.
Pues bien. Hoy descubrí (should RTFM more often) que existe una variable PIPESTATUS que guarda todos los error codes de todo el pipeline:
unit_test | grep -v Time
if [ ${PIPESTATUS[0]} -eq 0 ]
then
vim report.log
fi
Esta variable es un array que guarda un error code por cada comando en el pipe.
miércoles, 28 de julio de 2010
Doble indirección de la variable bash
Varias veces me pasó que tengo la siguiente situación: Tengo varias variables, en varios sabores. Supongamos que quiero firmar varias applicaciones, en modo debug y en modo release, y tengo que elegir el archivo de firmas correcto para cada combinación:
PACMAN_RELEASE=cert4821.cer
MARIO_RELEASE=cert3532.cer
PONG_RELEASE=cert3323.cer
PACMAN_DEBUG=cert3546.cer
MARIO_DEBUG=cert5984.cer
PONG_DEBUG=cert3287.cer
Y quiero obtener el valor de una variable dadas sus partes:
getVal() {
app=$1
env=$2
eval RESULT=\${${app}_${env}}
}
Esa función obtiene el valor de la variable cuyas partes están formadas por los valores de las variables app y env.
PACMAN_RELEASE=cert4821.cer
MARIO_RELEASE=cert3532.cer
PONG_RELEASE=cert3323.cer
PACMAN_DEBUG=cert3546.cer
MARIO_DEBUG=cert5984.cer
PONG_DEBUG=cert3287.cer
Y quiero obtener el valor de una variable dadas sus partes:
getVal() {
app=$1
env=$2
eval RESULT=\${${app}_${env}}
}
Esa función obtiene el valor de la variable cuyas partes están formadas por los valores de las variables app y env.
Suscribirse a:
Entradas (Atom)