¿Puedo hacer que todos los comandos tengan comentarios si han funcionado o no?

11

A veces, cuando ejecuto comandos, no muestra una salida, por lo que no estoy seguro de si han funcionado o no. ¿Es posible hacer que todos los comandos tengan retroalimentación si se han ejecutado correctamente o no? O, como mínimo, para mostrar la identificación de comentarios que han ejecutado (correctamente o no)

rajlego
fuente
66
La idea general es: sin comentarios significa que funcionó.
Rinzwind 01 de
1
Esto no es exactamente cierto. Por ejemplo, cryptsetuppuede omitir de manera predeterminada algunos mensajes de error. Es algo bueno tener $?en tu PS1. El siguiente paso es agregar también la hora actual, para conocer siempre los tiempos de los comandos;)
d33tah

Respuestas:

11

(Creo que ya que está publicando dentro de Ask Ubuntu , podemos suponer que está hablando del shell predeterminado, es decir, Bash ).

Hay una muy buena respuesta en la pregunta de desbordamiento de pila en un script de shell: los comandos de echo echo a medida que se ejecutan (esta no es solo una solución específica de Ubuntu).

Lo que debe hacer es usar el comando set para activar verbose o xtrace.

set -o

le dará una lista de los parámetros actuales se cambian a en o fuera .

set -v

o la versión de formato largo:

set -o verbose

a su vez, verbosa EN .

Sin embargo, creo que lo que quieres es en realidad xtrace. Esto no solo hará eco de cada comando que ejecute, sino que también ampliará los parámetros y le dará más comentarios. Entonces, si hago algo tan tonto como escribir 'hola' en la terminal, obtendré el eco de lo que escribí, así como un informe / seguimiento de lo que hizo el shell para intentar ejecutar el comando 'hola' (vea la captura de pantalla a continuación ):

Ingrese la descripción de la imagen aquí

Para habilitar xtrace:

set -x

o:

set -o xtrace

Para deshabilitar estos parámetros, usted (contra-intuitivamente) llama a los mismos comandos excepto con un símbolo más + en lugar de un guión o un símbolo menos, así, por ejemplo:

set +v

a su vez, verbosa OFF , parecida:

set +x

a su vez, xtrace OFF .


Una guía detallada sobre las opciones de shell se encuentra en el Capítulo 33. Opciones, Guía avanzada de secuencias de comandos Bash .

Benjamin R
fuente
1
Pero, ¿cómo funciona cuando el comando es correcto? ¿da alguna salida? decir por el comando whoami >/dev/null.
Usuario registrado
Sí, por supuesto que sí, se hace eco de lo que escribió más cualquier parámetro adicional involucrado en el comando que se invocó en silencio al invocar su comando. Si quiere decir, ¿imprime "ÉXITO", entonces, lamentablemente, no, la respuesta de Avinash Raj lo hará.
Benjamin R
@ PeterMortensen, gracias por las agradables ediciones sutiles de mi respuesta.
Benjamin R
13

Para verificar si algún comando funcionó correctamente o no, puede verificar el estado de retorno , dado por $?, del comando anterior con:

echo $?

Un estado de retorno de 0significa que el comando se completó con éxito, mientras que una salida distinta de cero ( código de error ) significaría que se encontraron algunos problemas o hay un error y la categoría se puede conocer a partir del código de error. Los códigos de error de Linux / C se definen en /usr/include/asm-generic/errno-base.hy /usr/include/asm-generic/errno.h.

También en bash, .bashrcdefine un alias alertque se puede usar para notificar con el estado de finalización. Tendría que adjuntar el alias con el comando o combo de comandos como este:

some_command --some-switch; alert

Puede agregar la siguiente línea de código a su ~/.bashrcarchivo para mostrar el estado de retorno del último comando ejecutado.

# show the return code of last command executed
PS1='${debian_chroot:+($debian_chroot)}\u@\h(lst ret. $(echo $?) ):\w\$ '

(abra el archivo ~/.bashrccon el editor de texto de su elección, y copie la línea anterior, péguelo en el archivo y guárdelo. Inicie una nueva instancia del terminal, y debería tenerlo en acción. O en su lugar podría definir alguna función y usar con lo PS1que se ilustra a continuación.)

una pequeña demostración:

hash@precise(lst ret. 0 ):~$ ls -sh someFileThatsNotThere
ls: cannot access someFileThatsNotThere: No such file or directory
hash@precise(lst ret. 2 ):~$ 
hash@precise(lst ret. 2 ):~$ aCommandThatsNot
aCommandThatsNot: command not found
hash@precise(lst ret. 127 ):~$ 
hash@precise(lst ret. 127 ):~$ echo "you should get a lst ret. 0, I believe the system has echo installed :)"
you should get a lst ret. 0, I believe the system has echo installed :)
hash@precise(lst ret. 0 ):~$
hash@precise(lst ret. 0 ):~$ sudo touch /tmp/someTestFile
[sudo] password for hash: 
hash@precise(lst ret. 1 ):~$
hash@precise(lst ret. 1 ):~$ chown $USER:$USER /tmp/someTestFile 
chown: changing ownership of `/tmp/someTestFile': Operation not permitted

Solo jugando con PS1:) ..un poco más,

function showRetStat {
## line1: initiliazing retStat with the return status of the previous command
retStat=$?
## line2: Left padding the return status with spaces. If you prefer the unpadded one, you can just replace
# $retStatFtd in the lines initializing noErrStr and errStr among other possible ways.
retStatFtd=$(sed -e :a -e 's/^.\{1,2\}$/ &/;ta' <<< $retStat)
## lines3&4: Setting the strings to display for a successful and unsuccessful run of previous command
# which we are going to display with the prompt string. Change the strings to display text of your
# choice like you may set noErrStr="yippie!" , errStr="oopsie!" in place of what they're now.
noErrStr="retStat "$retStatFtd" :: PASS ^_^"
errStr="retStat "$retStatFtd" :: FAIL x_x"
## line5: Applying the logic and display the proper string at the prompt. Space padded number i.e. retStatFtd, here,
# worked in the logic, originally I intended to use this for the display while retStat in the conditional
# check; you could make the function one statement less if you want to.
echo "$([ $retStatFtd = 0 ] && echo "$noErrStr" || echo "$errStr")"
}

## Combining the function showRetStat into the prompt string.
PS1='${debian_chroot:+($debian_chroot)}\u@\h($(showRetStat)):\w\$ '

(puede modificar la función para que sea más elegante, algo como lo hace @gronostaj en su publicación).

preciso
fuente
2
Realmente me gusta tu respuesta ampliada con ejemplos. Estoy bastante seguro de que OP quiere xtrace, pero personalmente lo encontraría útil para depurar mis propios programas de línea de comandos y para comprender mejor a los demás.
Benjamin R
1
Sugeriría rellenar a la izquierda el valor de retorno, para que siempre tenga la misma longitud.
o0 '.
+1 para modificar PS1. Este es el que uso, con número rojo en caso de errores, nada extra si el último comando tuvo éxito:\[\033[01;41;37m\]${?#0}\[\033[00;01;36m\] \u@\h:\w\[\033[00m\]\$
Carlos Campderrós
1
@rusty, ¿no es necesario obtener el ~/.bashrcarchivo fuente ?
Avinash Raj
2
Sí, modificar PS1 es útil y muy flexible. Muestro un feliz por ^_^el éxito y un rojo x_xpor cualquier otra cosa.
Izkata 01 de
5

Puede cambiar su símbolo del sistema para mostrar un signo de marca verde cuando el comando anterior sale con 0 y X roja de lo contrario. Arch Linux Wiki tiene un buen código para agregar a su bash.rc:

set_prompt () {
    Last_Command=$? # Must come first!
    Blue='\[\e[01;34m\]'
    White='\[\e[01;37m\]'
    Red='\[\e[01;31m\]'
    Green='\[\e[01;32m\]'
    Reset='\[\e[00m\]'
    FancyX='\342\234\227'
    Checkmark='\342\234\223'

    # Add a bright white exit status for the last command
    #PS1="$White\$? "
    # If it was successful, print a green check mark. Otherwise, print
    # a red X.
    if [[ $Last_Command == 0 ]]; then
        PS1+="$Green$Checkmark "
    else
        PS1+="$Red$FancyX "
    fi
    # If root, just print the host in red. Otherwise, print the current user
    # and host in green.
    if [[ $EUID == 0 ]]; then
        PS1+="$Red\\h "
    else
        PS1+="$Green\\u@\\h "
    fi
    # Print the working directory and prompt marker in blue, and reset
    # the text color to the default.
    PS1+="$Blue\\w \\\$$Reset "
}
PROMPT_COMMAND='set_prompt'

(He inhabilitado el código de error real porque no me gusta, si desea ver los códigos exactos simplemente eliminar #de esta línea: #PS1="$White\$? ")

Así es como se ve:

Captura de pantalla del terminal GUI

captura de pantalla de tty

gronostaj
fuente
2

, es posible obtener comentarios para cada comando que ejecutó en el terminal. Funciona sobre la base de lo echo $?cual devuelve 0 para completar con éxito el comando y cualquier otro valor que no sea 0 para el fallo.

Para obtener los comentarios de éxito o fracaso, agregue la siguiente línea al ~/.bashrcarchivo.

bind 'RETURN: ";if [[ $? == 0 ]]; then tput setaf 6 && echo SUCCESS; tput sgr0; else tput setaf 1 && echo FAILURE; tput sgr0; fi;\n"' 

Y luego el ~/.bashrcarchivo fuente para que funcione.

source ~/.bashrc

Explicación:

Para cada comando que ejecutó en el terminal, este ;if [[ $? == 0 ]]; then tput setaf 6 && echo SUCCESS; tput sgr0; else tput setaf 1 && echo FAILURE; tput sgr0; fi;código se vinculará automáticamente .

Ejemplo:

$ sudo apt-cache policy firefox;if [[ $? == 0 ]]; then tput setaf 6 && echo SUCCESS; tput sgr0; else tput setaf 1 && echo FAILURE; tput sgr0; fi;
firefox:
  Installed: 24.0+build1-0ubuntu1
  Candidate: 24.0+build1-0ubuntu1
  Version table:
 *** 24.0+build1-0ubuntu1 0
        500 http://ubuntu.inode.at/ubuntu/ saucy/main amd64 Packages
        100 /var/lib/dpkg/status
SUCCESS

$ suda apt-get update;if [[ $? == 0 ]]; then tput setaf 6 && echo SUCCESS; tput sgr0; else tput setaf 1 && echo FAILURE; tput sgr0; fi;
No command 'suda' found, did you mean:
 Command 'sudo' from package 'sudo-ldap' (universe)
 Command 'sudo' from package 'sudo' (main)
 suda: command not found
FAILURE

ingrese la descripción de la imagen aquí

Avinash Raj
fuente
1
bind 'RETURN: " && echo SUCCESS || echo FAILED \n"'también hará lo mismo, no necesita verificar [[ $? == 0 ]]explícitamente.
souravc 01 de
Sin embargo, el estándar C / Linux y la contraparte del estándar de gramática inglesa para 'Success' sería FALLO.
Benjamin R