Solucionar Problema con Fortunes

neko
  12 years ago
  -1

Tras la última actualización que he hecho de mi Linux Mint Xfce Debian Edition me quedé sin el mensaje de fortunes al arrancar un terminal, en lugar del mensaje del simpático animalito lo que obtenía era el error:

/usr/bin/mint-fortune: line 35: [: ==: unary operator expected

Es decir, se produce un error en la linea 35 del shell script mencionado, mirando dicha linea en el fichero /usr/bin/mint-fortune nos encontramos lo siguiente:

if [ $showfortunes == "true" ]; then

Cuya sintaxis es correcta, entonces ¿cuál es el problema?

Si nos fijamos en el error nos está diciendo que el shell espera encontrar un operador unario y sin embargo se encuentra con un operador binario (==)- El problema es debido a que uno de los argumentos se ha perdido, la línea que llega al shell es en realidad esta:

if [ == "true" ]; then

que efectivamente requeriría un operador unario en lugar del binario que utiliza. Pero ¿por qué ocurre esto si en la linea se están comparando dos valores?

El problema con el script es que la llamada a gconftool-2 provoca un error y por lo tanto no establece ningún valor en la variable showfortunes, que luego se usa para decidir si llamar o no a la función show_fortune que muestra el mensaje de fortunes.

El script de mint está pensado para trabajar con la variable de repositorio GConf /desktop/linuxmint/terminal/show_fortunes y por tanto asume que va a estar establecida. Así que simplemente comprueba si el comando gconftool-2 es ejecutable  (línea 33):

if [ -x "/usr/bin/gconftool-2" ]; then

y si es cierto supone que siempre funcionará y devolverá un valor, Así en la línea 34, tras comprobar que gconftool-2 es ejecutable, obtiene el valor de la variable /desktop/linuxmint/terminal/show_fortunes y lo asigna a la variable showfortunes:

showfortunes=`gconftool-2 --get /desktop/linuxmint/terminal/show_fortunes 2>/dev/null`

Y este es el gran problema, el script asume que la variable va a estar establecida. Sin embargo asumir que la variable va a tener un valor es asumir demasiado, porque al menos en mi Linux Mint Xfce Debian Edition esto no sucede, y al llamar a gconftool-2 preguntando por el valor de esa variable, obtengo un error de variable no definida y por tanto no se asigna nada a la variable showfortunes, y al llegar al if de la linea 35, la variable showfortunes se sustituye por su valor, es decir nada, y se ejecuta el if que ahora pasa de tener dos parámetros para su operador binario (==) a tener uno solo y de ahí el error de que se requiere un operador unario, pues solo hay un parámetro!

El script de mint tiene un error de concepto: debería proteger el test de la variable por si ésta no tuviese valor (justo lo que está sucediendo) , pero confia en que la llamada a gconftool-2 siempre funcionará si existe dicho comando ejecutable.

Por tanto, la solución es cambiar la línea 35 del script donde dice:

if [ $showfortunes == "true" ]; then

por esta otra:

if [ "$showfortunes" == "true" ]; then

A partir de ahora podemos controlar si queremos que aparezca o no el texto de fortunes al iniciar un terminal, simplemente estableciendo el valor de la variable /desktop/linuxmint/terminal/show_fortunes a true o a false.

Para que aparezca el fortune:

$ gconftool-2 –type string –set /desktop/linuxmint/terminal/show_fortunes “true”

Para que no aparezca:

$ gconftool-2 –type string –set /desktop/linuxmint/terminal/show_fortunes “false”