Могу ли я заставить все команды иметь обратную связь, если они работали или не работали?

Иногда, когда я запускаю команды, он не отображает вывод, поэтому я не уверен, работали они или нет. Возможно ли, чтобы все команды имели обратную связь, если они работали правильно или нет? Или на минимальном уровне для отображения идентификатора обратной связи, который они выполнили (соответственно или нет)

1
задан 1 April 2014 в 08:11

3 ответа

Чтобы проверить, успешно ли выполнена какая-либо команда, вы можете проверить статус возврата, заданный $? предыдущей командой, с помощью:

echo $?

Статус возврата 0 означает, что команда завершена успешно, в то время как ненулевой вывод ( статус возврата ) будет означать, что возникли некоторые проблемы или произошла ошибка, и категория может быть известна из кода ошибки. Коды ошибок Linux / C определены в /usr/include/asm-generic/errno-base.h и /usr/include/asm-generic/errno.h.

Также в bash .bashrc определяет псевдоним alert, который может использоваться для уведомления со статусом завершения. Вам нужно будет добавить псевдоним с помощью комманды команды или команды:

some_command --some-switch; alert

Вы можете добавить следующую строку кода в свой файл ~/.bashrc для отображения возвращаемый статус последней выполненной команды.

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

(откройте файл ~/.bashrc с помощью текстового редактора по вашему выбору и скопируйте приведенную выше строку, вставьте его в файл и сохранить. Запустите новый экземпляр терминала, и вы должны иметь его в действии. Или вместо этого вы можете определить некоторую функцию и использовать ее с PS1, как показано на рисунке ниже.)

немного demo:

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

Просто играя с PS1 :) .. немного больше,

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

(вы можете изменить функцию на сделайте его более причудливым, что-то вроде @gronostaj делает в своем посте.)

12
ответ дан 24 May 2018 в 10:11
  • 1
    Мне очень нравится ваш расширенный ответ с примерами. Я уверен, что OP хочет xxtrace, но лично я бы счел это полезным для отладки моих собственных программ командной строки, а также лучшего понимания других. – Benjamin R 1 April 2014 в 11:03
  • 2
    Я бы предложил оставить остаточное возвращаемое значение, чтобы оно всегда было одинаковой длины. – o0'. 1 April 2014 в 16:00
  • 3
    +1 для изменения PS1. Это тот, который я использую, с красным номером в случае ошибок, ничего лишнего, если последняя команда преуспела: \[\033[01;41;37m\]${?#0}\[\033[00;01;36m\] \u@\h:\w\[\033[00m\]\$ – Carlos Campderrós 1 April 2014 в 16:05
  • 4
    @rusty заключается в том, что нет необходимости в исходном файле ~/.bashrc? – Avinash Raj 1 April 2014 в 21:26
  • 5
    Да, изменение PS1 полезно и очень гибко. Я показываю счастливый успех ^_^ и красный x_x на что-нибудь еще. – Izkata 1 April 2014 в 23:52

Вы можете изменить свою командную строку, чтобы отобразить зеленый знак галочки, когда предыдущая команда выходит с 0 и красным X в противном случае. В Arch Linux Wiki есть хороший код для добавления к вашему 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'

(я отключил фактический код ошибки, потому что мне это не нравится, если вы хотите увидеть точные коды просто удаляют # из этой строки: #PS1="$White\$? ")

Вот как это выглядит:

GUI Terminal screenshot 6]

4
ответ дан 24 May 2018 в 10:11

Да, вы можете получить обратную связь для каждой команды, которую вы выполнили на терминале. Она работает на основе echo $?, которая возвращает 0 для успешного завершения команды и любое другое значение, отличное от 0 для отказа. [!d0 ]

Чтобы получить обратную связь с успехом или неудачей, добавьте следующую строку в файл ~/.bashrc.

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

И затем файл источника ~/.bashrc, чтобы он работал.

source ~/.bashrc
]

Да

Для каждой команды, выполненной на терминале, этот код ;if [[ $? == 0 ]]; then tput setaf 6 && echo SUCCESS; tput sgr0; else tput setaf 1 && echo FAILURE; tput sgr0; fi; будет автоматически связываться с ней.

автоматически

$ 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

2
ответ дан 24 May 2018 в 10:11
  • 1
    bind 'RETURN: " && echo SUCCESS || echo FAILED \n"' также сделает то же самое, вам не нужно явно указывать [[ $? == 0 ]]. – souravc 1 April 2014 в 20:37
  • 2
    Тем не менее, стандартом C / Linux и стандартом грамматики английского языка к «Успеху» будет FAILURE. – Benjamin R 1 April 2014 в 23:55

Другие вопросы по тегам:

Похожие вопросы: