Bash - Suprimiendo la salida a STDOUT

4

He escrito un script para las nuevas instalaciones de macOS que instala Homebrew, Cask y un montón de aplicaciones que me gustan, además de crear un archivo .vimrc .

Gracias a una respuesta de daniel Azuelos (ubicada aquí: ¿La mejor forma de verificar en bash si las herramientas de línea de comandos están instaladas? ), una parte del script verifica si las herramientas de línea de comandos de Xcode están instaladas.

Cuando las herramientas de línea de comandos no están instaladas, este error se muestra al usuario:

xcode-select: error: unable to get active developer directory, use 'sudo xcode-select --switch path/to/Xcode.app' to set one (or see 'man xcode-select')

Espero que alguien pueda ayudarme a suprimir esta salida.

La función que se ejecuta para realizar la comprobación de las herramientas de la línea de comandos es:

function check_clt() {
    if type xcode-select >&- && xpath=$( xcode-select --print-path ) && test -d "${xpath}" && test -x "${xpath}" ; then
        echo ""
        echo "The required Xcode command-line-tools are already installed! Moving on!"
        sleep 3
    else
        instructions
        sleep 45
        xcode-select --install
    fi
}

Creo que puedo usar 2 > /dev/null para suprimir el error, pero no estoy seguro de la función a dónde debería ir. Lo puse antes de cada && en la sentencia if, pero el mensaje de error aún aparecía.

Usando la sugerencia de Nimesh, he editado la función:

function check_clt() {
if type xcode-select 2>/dev/null >&- && xpath=$( xcode-select --print-path ) 2>/dev/null && test -d "${xpath}" 2>/dev/null && test -x "${xpath}" 2>/dev/null ; then
    echo ""
    echo "The required Xcode command-line-tools are already installed! Moving on!"
    sleep 3
else
    instructions 2>/dev/null
    sleep 45
    xcode-select --install
fi

}

La ejecución del script todavía produce el error al usuario:

Last login: Tue Sep  4 20:40:13 on ttys000
vimusrs-Mac:~ vimusr$ cd Desktop/
vimusrs-Mac:Desktop vimusr$ chmod +x mai.sh 
vimusrs-Mac:Desktop vimusr$ ./mai.sh 
xcode-select: error: unable to get active developer directory, use 'sudo xcode-select --switch path/to/Xcode.app' to set one (or see 'man xcode-select')
    
pregunta vim_usr 05.09.2018 - 04:41

2 respuestas

1

Resulta que la línea xpath=( xcode-select --print-path ) en la declaración if de la función original fue el problema. Además, una vez que obtuve el mensaje de error suprimido, noté que había un mensaje stdout innecesario, así que decidí suprimirlo también.

Pude suprimir los mensajes stderror y stdout cambiando la función a lo siguiente:

function check_clt() {
    if type xcode-select >/dev/null 2>&1 >&- && xcode-select -p >/dev/null 2>&1 && test -d $(xcode-select -p) >/dev/null 2>&1 && test -x $(xcode-select -p) >/dev/null 2>&1; then
        echo ""
        echo "The required Xcode command-line-tools are already installed! Moving on!"
        sleep 3
    else
        instructions
        sleep 45
        xcode-select --install
    fi
}
    
respondido por el vim_usr 05.09.2018 - 08:17
0

Modifique el script bash de la siguiente manera:

function check_clt() {
    if type xcode-select 2>/dev/null >&- && xpath=$( xcode-select --print-path ) 2>/dev/null && test -d "${xpath}" 2>/dev/null && test -x "${xpath}" 2>/dev/null ; then
        echo ""
        echo "The required Xcode command-line-tools are already installed! Moving on!"
        sleep 3
    else
        instructions 2>/dev/null
        sleep 45
        xcode-select --install
    fi
}

Redirija el error estándar (STDERR) a /dev/null donde un comando pueda generar un error. Tenga en cuenta que si instructions consta de varios comandos, agregue 2>/dev/null antes de cada invocación de comando.

    
respondido por el Nimesh Neema 05.09.2018 - 05:11

Lea otras preguntas en las etiquetas