Posso fazer com que todos os comandos tenham feedback se trabalharam ou não?

11

Às vezes, quando executo comandos, ele não exibe uma saída, então não tenho certeza se eles funcionaram ou não. É possível fazer com que todos os comandos tenham feedback se tiverem funcionado corretamente ou não? Ou no mínimo para exibir o ID de feedback que eles correram (corretamente ou não)

    
por rajlego 01.04.2014 / 05:11

4 respostas

12

(acho que desde que você está postando dentro Ask Ubuntu podemos supor que você está falando sobre o shell padrão, isto é, Bash .)

Existe uma resposta muito boa na questão do Stack Overflow Em um script de shell: comandos echo shell como eles são executados (isto não é apenas uma solução específica do Ubuntu).

O que você precisa fazer é usar o comando set para ativar o verbose ou o xtrace.

set -o

fornecerá uma lista de quais parâmetros atuais são alternados para em ou desativado .

set -v

ou a versão em formato longo:

set -o verbose

irá tornar-se verboso ON .

Acho que o que você quer, na verdade, é o xtrace. Isso não só irá ecoar cada comando que você executar, ele também irá expandir os parâmetros e dar-lhe mais feedback. Então, se eu fizer algo tão bobo quanto digitar 'oi' no terminal, eu terei o eco do que eu digitei, bem como um relatório / rastreamento do que o shell fez para tentar executar o comando 'oi' ):

Para ativar o xtrace:

set -x

ou:

set -o xtrace

Para desativar esses parâmetros, você (contra-intuitivamente) chama os mesmos comandos, exceto com um símbolo de mais + em vez de um traço ou símbolo de menos, por exemplo:

set +v

transformará verbose OFF , da mesma forma:

set +x

irá ativar o OFF do xtrace.

Um guia detalhado sobre opções de shell está em Capítulo 33. Opções, Guia Avançado de Roteiro de Script .

    
por Benjamin R 01.04.2014 / 06:52
12

Para verificar se algum comando funcionou com sucesso ou não, você pode verificar o status de retorno , dado por $? , do comando anterior com:

echo $?

Um status de retorno de 0 significa que o comando foi concluído com êxito, enquanto uma saída diferente de zero ( código de erro ) significa que alguns problemas foram encontrados ou há um erro e a categoria pode ser conhecida do código de erro. Os códigos de erro do Linux / C são definidos em /usr/include/asm-generic/errno-base.h e /usr/include/asm-generic/errno.h .

Também no bash, o .bashrc define um alias alert , que pode ser usado para notificar com o status de conclusão. Você teria que anexar o alias com o comando ou combinação de comando assim:

some_command --some-switch; alert

Você pode anexar a seguinte linha de código ao seu arquivo ~/.bashrc para exibir o status de retorno do último comando executado.

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

(abra o arquivo ~/.bashrc com o editor de texto de sua escolha, copie a linha acima, cole-a no arquivo e salve. Inicie uma nova instância do terminal e você deverá executá-la em ação. poderia definir alguma função e usá-lo com PS1 , como ilustrado abaixo.)

uma pequena demonstração:

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

Apenas jogando com PS1 :) ..um pouco mais,

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$ '

(você pode modificar a função para torná-la mais chique, algo como @gronostaj faz em seu post.)

    
por precise 01.04.2014 / 06:53
4

Você pode alterar seu prompt de comando para exibir um sinal de visto verde quando o comando anterior sair com 0 e X vermelho, caso contrário. O Arch Linux Wiki tem um bom pedaço de código para adicionar ao seu 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='247'
    Checkmark='243'

    # 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'

(Desativei o código de erro real porque não gosto disso, se você quiser ver os códigos exatos basta remover # desta linha: #PS1="$White$? " )

Veja como fica:

    
por gronostaj 01.04.2014 / 14:10
2

Sim , é possível obter feedback para cada comando que você executou no terminal. Ele funciona com base em echo $? , que retorna 0 para uma conclusão bem-sucedida do comando e qualquer outro valor que não seja 0 por falha.

Para obter o feedback de sucesso ou falha, adicione a linha abaixo ao arquivo ~/.bashrc .

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

E, em seguida, escolha o arquivo ~/.bashrc para que funcione.

source ~/.bashrc

Explicação:

Para cada comando que você executou no terminal, esse código ;if [[ $? == 0 ]]; then tput setaf 6 && echo SUCCESS; tput sgr0; else tput setaf 1 && echo FAILURE; tput sgr0; fi; irá automaticamente ficar vinculado a ele.

Exemplo:

$ 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

    
por Avinash Raj 01.04.2014 / 15:33