Scripts y su entorno

¿Qué tiene de especial la salida por pantalla de un df (disk free)?. Nada si no nos fijamos en las formas. Pongamos un ejemplo para que se entienda lo que quiero explicar:
[root@muro: r0sk] # uname
FreeBSD
[root@muro: r0sk] # df
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/ad0s1a 37385196 1377416 33016966 4% /
devfs 1 1 0 100% /dev
devfs 1 1 0 100% /var/named/dev
[root@muro: r0sk] #
En una máquina provista y equipada con FreeBSD he mirado el espacio que queda libre en disco. El particionado de esta máquina en concreto es trivial, una sola partición para todo el sistema (/dev/ad0s1a) y de los 37385196 bloques de disco, 1377416 están usados.
Ahora hagamos otra sencilla prueba creando un script en shell que haga lo mismo dejando el resultado en un archivo log, lo metemos en el crontab para que se ejecute cada minuto (por no esperar un tiempo prudencial y observar resultados), el ejemplo puede ser el siguiente:
[root@muro: r0sk] # cat df_script.sh
#!/bin/sh
DF=`/bin/df`
echo "$DF" >> /home/r0sk/df_script.log
[root@muro: r0sk] # crontab -l
1/* * * * * sh /home/r0sk/df_script.sh
[root@muro: r0sk] #
Ahora es cuando viene la sorpresa, echando un vistazo a df_script.log:
[root@muro: r0sk] # cat df_script.log
Filesystem 512-blocks Used Avail Capacity Mounted on
/dev/ad0s1a 74770392 2737508 66051256 4% /
devfs 2 2 0 100% /dev
devfs 2 2 0 100% /var/named/dev
[root@muro: r0sk] #
¡Oh, oh!, las variables de entorno nos están jugando una mala pasada. En shell el tamaño sale expresado en bloques de 1K mientras que en cron los bloques son de 1/2K. He ahí que los valores se multipliquen. El resultado es el mismo así que, leyendo la ayuda de df tenemos la solución a nuestras discrepancias:
-k Use 1024-byte (1-Kbyte) blocks rather than the default. Note
that this overrides the BLOCKSIZE specification from the environment.
Moraleja: Ojo con las variables de entorno al jugar con cron o con distintos tipos de shell (bash, sh, csh...), puede provocar dolor de cabeza y/o agitación mental durante largo periodo.