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

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

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

4 ответа

(Я думаю, так как Вы отправляете, внутри Спрашивают Ubuntu, мы можем предположить, что Вы говорите об оболочке по умолчанию, то есть, Bash.)

Существует очень хороший ответ в вопросе о Переполнении стека В сценарии оболочки: повторите команды оболочки, поскольку они выполняются (это не просто определенное для Ubuntu решение).

То, что необходимо сделать, использовать команду набора для превращения подробным или xtrace на.

set -o

даст Вам, список которых текущие параметры переключаются на на или прочь.

set -v

или подробная версия:

set -o verbose

станет подробным НА.

Я думаю, что Вы хотите, тем не менее, на самом деле xtrace. Это не только повторит каждую команду, которую Вы выполняете, она также развернет параметры и даст Вам больше обратной связи. Таким образом, если я сделаю что-то столь же глупое как вводящий 'привет' на терминале, то я получу эхо того, что я ввел, а также отчет/трассировка о том, что оболочка сделала, чтобы попытаться выполнить команду 'привет' (см. снимок экрана ниже):

Enter image description here

Включить xtrace:

set -x

или:

set -o xtrace

Для отключения этих параметров Вы (парадоксально) называете те же команды кроме с плюс символ + вместо тире или минус символ, таким образом, например:

set +v

станет подробным ПРОЧЬ, так же:

set +x

выключит xtrace.


Подробное руководство на опциях оболочки находится в Главе 33. Опции, Усовершенствованное Руководство по созданию сценариев Bash.

11
ответ дан 16 November 2019 в 14:48

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

echo $?

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

Также в ударе, .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 как подобный, проиллюстрированный ниже.)

немного демонстрации:

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 делает в его сообщении.)

13
ответ дан 16 November 2019 в 14:48

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

Для получения обратной связи успешности или неуспешности добавьте ниже строки к ~/.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

enter image description here

2
ответ дан 16 November 2019 в 14:48

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

tty screenshot

5
ответ дан 16 November 2019 в 14:48

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

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