1 votos

"whatis" devuelve 0 por falta de comandos

En macOS 10.14, usando whatis sobre un comando que no está instalado imprime 'command': nothing appropriate como se espera. Pero devuelve 0 en lugar de un código de error, que creo que es el comportamiento esperado. Tampoco es coherente con man, que devuelve 1 después de que no haya resultados. Además, whatis imprime en la salida estándar, mientras que man imprime a stderr.

Esto es diferente que la de Linux, que devuelve un código de error, y se imprime a stderr.

macOS:

$ whatis abc; echo $?
abc: nothing appropriate
0

$ man abc; echo $?
No manual entry for abc
1

$ whatis abc 2>/dev/null
abc: nothing appropriate

$ man abc 2>/dev/null

Linux (Ubuntu):

$ whatis abc; echo $?
abc: nothing appropriate.
16

$ man abc; echo $?
No manual entry for abc
16

$ whatis abc 2>/dev/null

$ man abc 2>/dev/null

Creo whatis no debe devolver 0 cuando no puede encontrar una descripción de la orden, y deben tener un comportamiento coherente con man

Nota: me di cuenta de esto porque estoy escribiendo un programa que se basa en esta funcionalidad

Edit: apropos tiene el mismo comportamiento como whatis

2voto

En macOS whatis es sólo una secuencia de comandos de shell.

$ type whatis
whatis is hashed (/usr/bin/whatis)
$ file /usr/bin/whatis
/usr/bin/whatis: POSIX shell script text executable, ASCII text

Si nos fijamos en el interior, la parte pertinente reza

while [ "$1" != "" ]
do
    found=0
    for d in /var/cache/man $manpath /usr/lib
    do
        if [ -f $d/whatis ]
        then
            if grep -"$grepopt1" "$grepopt2""$1" $d/whatis
            then
                found=1
            fi
        fi
    done

    if [ $found = 0 ]
    then
        echo "$1: nothing appropriate"
    fi

    shift
done | eval ${PAGER:-more -E}

Así que si no las entradas se encuentran ( if [ $found = 0 ] parte), se muestra el mensaje sin establecer ningún código de salida. En realidad, la secuencia de comandos sólo sale con el estado 1 si mal argumentos han pasado.

La actualización más reciente aviso se refiere a 2003-08-01 como la fecha de la actualización, por lo que parece ser más antiguo de todos modos. Si el comportamiento es una función o un bug está abierto para la discusión.


En caso de que usted se está preguntando acerca de la apropos mostrando el mismo comportamiento: apropos y whatis son básicamente el mismo guión.

$ ll /usr/bin/{apropos,whatis}
-r-xr-xr-x  1 root  wheel  1808 Aug 18 00:18 /usr/bin/apropos*
-r-xr-xr-x  1 root  wheel  1806 Aug 18 00:18 /usr/bin/whatis*
$ diff /usr/bin/{apropos,whatis}
26,27c26,27
< grepopt1=$aproposgrepopt1
< grepopt2=$aproposgrepopt2
---
> grepopt1=$whatisgrepopt1
> grepopt2=$whatisgrepopt2

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X