Чи можу я зробити так, щоб усі команди мали зворотний зв'язок, якщо вони працювали чи не працювали?


11

Іноді, коли я запускаю команди, він не відображає вихід, тому я не впевнений, працювали вони чи ні. Чи можна зробити так, щоб усі команди мали зворотній зв'язок, якщо вони виконані правильно чи ні? Або на мінімальному рівні, щоб відобразити ідентифікатор зворотного зв’язку, який вони побігли (правильно чи ні)


6
Загальна ідея така: відсутність зворотного зв'язку означає, що він працював.
Rinzwind

1
Це не зовсім так. Наприклад, cryptsetupможе за промовчанням пропустити деякі повідомлення про помилки. Це добре мати $?у себе PS1. Наступним кроком є ​​також додавання поточного часу, щоб завжди знати терміни команд;)
d33tah

Відповіді:


11

(Я думаю, оскільки ви публікуєте всередині Ask Ubuntu, ми можемо припустити, що ви говорите про оболонку за замовчуванням, тобто Bash .)

Є дуже гарна відповідь на запитання про переповнення стека. У сценарії оболонки: команди ехо-оболонки під час їх виконання (це не лише рішення для Ubuntu).

Що потрібно зробити, це використовувати команду set, щоб увімкнути багатослівний або xtrace.

set -o

дасть вам список з яких поточні параметри переключаються на або вимкнений .

set -v

або версія longform:

set -o verbose

поверне багатослівним ON .

Я думаю, що те, що ти хочеш, насправді є xtrace. Це не лише перегукнеться з кожною командою, яку ви виконуєте, але також розширить параметри та надасть більше відгуків. Тож якщо я зробить щось таке нерозумне, як набрати "привіт" у терміналі, я отримаю відгомін того, що я набрав, а також звіт / слід про те, що оболонка зробила для спроби виконання команди "привіт" (див. Скріншот нижче ):

Введіть тут опис зображення

Щоб увімкнути xtrace:

set -x

або:

set -o xtrace

Щоб вимкнути ці параметри, ви (протиінтуїтивно) викликаєте ті самі команди, за винятком символу плюс + замість символу тире чи мінусу, наприклад:

set +v

поверне багатослівним OFF , аналогічно:

set +x

буде вимкнено xtrace .


Докладний посібник щодо параметрів оболонки знаходиться у розділі 33. Параметри, Додаткові посібники із сценаріїв Bash .


1
Але як це працює, коли команда правильна? це дає якийсь вихід? скажіть для команди whoami >/dev/null.
Зареєстрований користувач

Так, звичайно, це є, це повторює те, що ви ввели плюс додаткові параметри, що входять до команди, які були безшумно викликані при виклику вашої команди. Якщо ви маєте на увазі, чи друкує вона "УСПІХ", то, на жаль, ні, відповідь Авінаша Раджа зробить це.
Бенджамін R

@PeterMortensen дякую за прекрасні тонкі зміни моєї відповіді.
Бенджамін R

13

Для того, щоб перевірити , якщо деякі команди успішно працювали або ви не можете перевірити статус повернення , що задається $?, з попередньої команди з:

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як, як показано нижче.)

трохи демонстрації:

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 робить у своєму дописі.)


2
Мені дуже подобається ваша розгорнута відповідь із прикладами. Я впевнений, що OP хоче xtrace, але особисто я вважаю це корисним для налагодження власних програм командного рядка, а також для кращого розуміння інших.
Бенджамін Р

1
Я б запропонував повернути ліворуч значення повернення, щоб воно завжди було однакової довжини.
o0 '.

+1 для зміни PS1. Це той, який я використовую, з червоним номером у випадку помилок, нічого зайвого, якщо остання команда вдалася:\[\033[01;41;37m\]${?#0}\[\033[00;01;36m\] \u@\h:\w\[\033[00m\]\$
Carlos Campderrós

1
@rusty це не потрібно джерело ~/.bashrcфайлу?
Avinash Raj

2
Так, модифікація PS1 корисна і дуже гнучка. Я показую щасливий ^_^на успіх, і червоний x_xна будь-що інше.
Ізката

5

Ви можете змінити командний рядок, щоб відобразити зелений знак галочки, коли попередня команда закінчується 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

tty скріншот


2

Так , можна отримати зворотний зв'язок для кожної команди, виконаної на терміналі. Вона працює, на основі 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

введіть тут опис зображення


1
bind 'RETURN: " && echo SUCCESS || echo FAILED \n"'також зробимо те саме, вам не потрібно [[ $? == 0 ]]чітко перевіряти .
souravc

Однак стандарт C / Linux та англійський стандарт граматики, що відповідає "Успіху", були б НЕПРАВНИМИ.
Бенджамін Р
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.