От доста време назад ние изброихме 8 Полезни и интересни баш-бандата. Това се оказа една от най-популярните ни статии и все още генерира отговор и обратна връзка от страна на потребителите. Този път сме намерили още няколко скъпоценни камъни, както и някои полезни съвети и трикове, за да имаме най-яката подсказка за черупката на пословичния блок.

Използване на тези известия

Някои от следващите подсказвания са еднолични и могат да бъдат поставени директно във вашия терминал за (временно) използване. За да ги направите постоянни, ще трябва да поставите кода във вашия .bashrc или .bash_profile .

По-големите и по-сложни подсказвания като Twtty трябва да бъдат запазени в собствения си скриптов файл (като myprompt.sh) и да поставите линия като

 източник myprompt.sh 

във вашия .basrc файл, за да ги "импортирате".

Twtty Prompt

Това е двуредов подкана, който съдържа доста информация, включително потребителско име, име на хост, работна директория, време и номер на историята на командите. Поради техническата и визуална сложност, най-добре е да поставите този подканен скрипт в неговия собствен файл, след което да го изведете от вашия .bashrc или .bash_profile, както е описано по-горе.

 Функция prompt_command {TERMWIDTH = $ {COLUMNS} # Изчислете ширината на подкана: hostname = $ (echo -n $ HOSTNAME | sed -e "s /[\.].*//") # "whoami" и "pwd "include newline usernam = $ (whoami) cur_tty = $ (tty | sed -e" s /.* tty \ (. * \) / \ 1 / "newPWD =" $ {PWD} "# аксесоарите по-долу ... нека promptsize = $ (echo -n "- ($ {usernam} @ $ {hostnam}: $ {cur_tty}) --- ($ {PWD} ($ fillsize) -gt "0"] fill = $ {fill} - "let {fillsize = $ {fillsize} } -1, ако ["$ fillsize" -lt "0"], тогава оставете да се намали = 3 - $ {fillsize} newPWD = "... $ (echo -n $ PWD | sed -e" s / \. \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ \ 033 [0; 37m \] "локално WHITE =" \ [\ 033 [1; 37m \] "локално NO_COLOUR =" \ [033 [0m "] локално LIGHT_BLUE =" \ ] "местен YELLOW =" \ [\ 033 [1; 33m \] "случай $ TERM в xterm *) TITLEBAR = '\ [033] 0; \ u @ \ h: \ w \ 007 \; *) TITLEBAR = "" ;; esac PS1 = "$ TITLEBAR \ $ YELLOW- $ LIGHT_BLUE" - $ {YELLOW} - \ $ $ YELLOW $ $ LIGHT_BLUE $ LIGHT_BLUE $ LIGHT_BLUE $ LIGHT_BLUE {fill} $ {LIGHT_BLUE} - (\ $ YELLOW \ $ {newPWD} \ $ LIGHT_BLUE) - $ YELLOW- \\ n \ $ YELLOW- $ LIGHT_BLUE - $ \ YELLOW \ $ LIGHT_BLUE: $ YELLOW \ $ NO_COLOUR "PS2 =" $ LIGHT_BLUE- $ LIGHT_BLUE: $ YELLOW \ $ (дата \ "+% a, % d% b% y \") \ $ LIGHT_BLUE: $ WHITE \ $ LIGHT_BLUE ЖЪЛТО- $ ЖЪЛТО- $ NO_COLOUR "} 

Едно важно нещо, което трябва да обърнете внимание на този прозорец е, че хоризонталната лента се мащабира, за да се побере в ширината на вашия терминал и че работната директория ще се скъса, когато стане твърде голяма.

Ако имате проблеми с горния кодов фрагмент, версията на обикновен текст може да бъде изтеглена тук.

Високопроизводителен минималистичен подканд

Всички сложности на фантастичен прозорец, като Twtty, заемат допълнителни цикли на процесора и макар че със сигурност няма да спрат системата ви за спиране, тя може да се добави. Ако искате нещо, което опакова много информация, без да ви забавя, предлагам това:

 PS1 = "[\ d | \ T -> \ w ... \ $?] \ N #" 

Едно интересно нещо, което да се отбележи тук, е използването на променливата $? накрая. Това означава изходното състояние на последната въведена команда. 0 означава, че всичко е наред, всеки друг номер обикновено показва грешка.

Проблемът на Роб

Това е един от най-популярните подкани, плаващи по интернет. Кодът е малък и прост, но дава много от функциите, които се намират в по-големите, по-сложни примери.

 PS1 = "\ [033 [0; 33m \] [\!] \` Ако [[\ $? = "0"]]; "\\ [\\ 033 [31m \\]" \ fi \ \ \ u \ \: \ "ако [[` pwd | wc -c | tr -d "" ` \\ W "; else echo" \\ w "; fi \"] \ $ \ [\ 033 [0m \] "; echo -ne "\ 033] 0;" име на хост-s ":" pwd` \ 007 " 

MegaFancyPrompt

Името е напълно заслужено - този провайд е доста голям и изключително фантастичен. Има цвят, контрол на заглавната лента, информираност на потребителите, откриване на прокси, откриване на екрана, брой на заданията и др. Накратко, почти всички функции, намерени в другите указания, които споменахме, могат да бъдат намерени тук и доста други. Ако искате всичко в подканата си, това е всичко.

Забележка: Не всички функции са видими по всяко време, така че, макар че не може да изглежда много в екранната снимка, можете да разгледате целия скрипт файл (документирани, коментирани) тук за подробности как да получите видимите части, които искате.

 COLOR_WHITE = '\ 033 [1; 37m' COLOR_LIGHTGRAY = '033 [0; 37m' COLOR_GRAY = '\ 033 [1; 30m' COLOR_BLACK = '\ 033 [0; 30m' COLOR_RED = '033 [ = '\ 033 [1; 31m' COLOR_GREEN = '\ 033 [0; 32m' COLOR_LIGHTGREEN = '\ 033 [1; 32m' COLOR_BROWN = '\ 033 [0; 33m' COLOR_YELLOW = '\ 033 [1; = '\ 033 [0; 34m' COLOR_LIGHTBLUE = '\ 033 [1; 34m' COLOR_PURPLE = '\ 033 [0; 35m' COLOR_PINK = '\ 033 [1; 35m' COLOR_CYAN = '\ 033 [0; 36m' COLOR_LIGHTCYAN = '\ 033 [1; 36m' COLOR_DEFAULT = '\ 033 [0m' # Функция за задаване на prompt_command на. функция promptcmd () {history -a local SSH_FLAG = 0 местен TTY = $ (tty | awk -F / dev / '{print $ 2}') ако [[$ {TTY}]; след това локално SESS_SRC = $ (който | grep "$ TTY" | awk '{print $ 6}') fi # Тип за заглавие $ {TERM} в xterm *) локално TITLEBAR = '\ [033] 0; \ u @ \ h : {\ w} \ 007 \] '; *) местен TITLEBAR = '' ;; esac PS1 = "$ {TITLEBAR}" # Тест за промяна на деня. ако [-z $ DAY]; след това експортирайте DAY = $ (дата +% A), ако днес [= $ {DAY} "! =" $ {today} ") е друго местно днес = $ (дата +% A); след това PS1 = "$ {PS1} \ n \ [$ {COLOR_GREEN} \] Ден е променен на $ (дата '+% A, % d% B% Y'). ако [$ {UID} -eq 0]; след това, ако ["$ {USER}" == "$ {LOGNAME}"); тогава ако [[$ {SUDO_USER}]]; а след това PS1 = "$ {PS1} \ [$ {COLOR_RED} \] \ u" друго PS1 = "$ {PS1} \ [$ {COLOR_LIGHTRED} \] {COLOR_YELLOW} \] \ u "бъдете, ако [$ {USER} == $ {LOGNAME}]; след това PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \] \ u" иначе PS1 = "$ {PS1} \ [$ {COLOR_BROWN} n "$ http_proxy"]; след това PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \] @" иначе PS1 = "$ {PS1} \ [$ {COLOR_LIGHTRED} \] @" fi # Хост ако [[$ {SSH_CLIENT}] | [[$ {SSH2_CLIENT}]]; след това SSH_FLAG = 1 fi ако [$ {SSH_FLAG} -eq 1]; след това PS1 = "$ {PS1} \ [$ {COLOR_CYAN} \] \ h" elif [[-n $ {SESS_SRC}]]; след това ако ["$ {SESS_SRC}" == "(: 0.0)"]; след това PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \] \ h" иначе местен parent_process = "cat / proc / $ {PPID} / cmdline" ]]; след това PS1 = "$ {PS1} \ [$ {COLOR_BROWN} \] \ h" elif [["$ parent_process" == "in.telnetd *"]]; след това PS1 = "$ {PS1} \ [$ {COLOR_YELLOW} \] \ h" иначе PS1 = "$ {PS1} \ [$ {COLOR_LIGHTRED} \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" = ""]; след това PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \] \ h" иначе PS1 = "$ {PS1} \ [$ {COLOR_RED} \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" ls | grep -c Detach), ако [$ {DTCHSCRN} -gt 2]; след това PS1 = "$ {PS1} \ [$ {COLOR_RED} \] [scr: $ {DTCHSCRN}]" elif [$ {DTCHSCRN} -gt 0]; след това PS1 = "$ {PS1} \ [$ {COLOR_YELLOW} \] [scr: $ {DTCHSCRN}]" ## BKGJBS = $ (jobs -r | wc -l) gt;]; след това PS1 = "$ {PS1} \ [$ {COLOR_RED} \] [bg: $ {BKGJBS}]" elif [$ {BKGJBS} -gt 0]; след това [$ {STPJBS} -gt = PS1 = "$ {PS1} \ [$ {COLOR_YELLOW} \] [bg: $ {BKGJBS} 2]; след това PS1 = "$ {PS1} \ [$ {COLOR_RED} \] [stp: $ {STPJBS}]" elif [$ {STPJBS} -gt 0]; след това PS1 = "$ {PS1} \ [$ {COLOR_YELLOW} \] [stp: $ {STPJBS}]" fi # Bracket {if [$ {UID} -eq 0]; след това, ако ["$ {USER}" == "$ {LOGNAME}"); тогава ако [[$ {SUDO_USER}]]; след това PS1 = "$ {PS1} \ [$ {COLOR_RED} \]" иначе PS1 = "$ {PS1} \ [$ {COLOR_LIGHTRED} ] "else ако [" $ {USER} "==" $ {LOGNAME} "); PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \" "else PS1 =" $ {PS1} \ [$ {COLOR_BROWN} -w "$ {PWD}"]; след това PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \] $ (prompt_workingdir)" else "PS1 =" $ {PS1} \ [$ {COLOR_RED} # ако [$ {UID} -eq 0]; след това, ако ["$ {USER}" == "$ {LOGNAME}"); тогава ако [[$ {SUDO_USER}]]; след това PS1 = "$ {PS1} \ [$ {COLOR_RED} \]" иначе PS1 = "$ {PS1} \ [$ {COLOR_LIGHTRED} ] "else ако [" $ {USER} "==" $ {LOGNAME} "); PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \]" иначе PS1 = "$ {PS1} \ [$ {COLOR_BROWN} COLOR_DEFAULT} \] "} # Подрязване на работната директория до 1/4 на функцията за ширината на екрана prompt_workingdir () {local pwdmaxlen = $ (($ COLUMNS / 4)) локален trunc_symbol =" ... "ако [[$ PWD == $ У ДОМА* ]]; след това newPWD = "~ $ {PWD # $ HOME}" else newPWD = $ {PWD} fi ако [$ {# newPWD} -gt $ pwdmaxlen]; след това локално pwdoffset = $ ($ {# newPWD} - $ pwdmaxlen + 3)) newPWD = "$ {trunc_symbol} $ {newPWD: $ pwdoffset: $ pwdmaxlen} 1. Показване на прост персонализиран подкана за сесиите на shell, започнати # по скрипт. # 2. Показване на "скучно" подкана за shell сесии в emacs или # xemacs. # 3 Показва се prompt за всички останали случаи. функция load_prompt () {# Вземете PIDs локален parent_process = $ (котка / proc / $ PPID / cmdline | cut -d \. -f 1) локална my_process = $ (котка / proc / $$ / cmdline | -f 1) ако [[$ parent_process == скрипт *]]; след това PROMPT_COMMAND = "" PS1 = "\ t - \ # - \ u @ \ H {\ w} \ $" elif [[$ parent_process == emacs * || $ parent_process == xemacs *]]; след това PROMPT_COMMAND = "" PS1 = "\ u @ \ h {\ w} \ $" друг износ DAY = $ (дата +% A) PROMPT_COMMAND = prompt export export PS1 PROMPT_COMMAND load_prompt 

Бонус - Намиране на правилните цветове

Както може би сте забелязали, повечето от тези подкана използват цвят и цветът често се представя в кодирана форма като '\ 033 [1; 30m', което е доста трудно за четене или запомняне. Лесен начин да видите всички налични цветове и да визуализирате как ще изглеждат е просто да поставите следния фрагмент в браузъра си:

 за аз в `следващ 1 7; сек. 30 48; сек 90 107 '; направете ехо-е "\ e [$ {i} mtest \ e [0m $ i" направено 

Кой ще изведе всеки цветен код с неговия номер.

заключение

Съществуват, разбира се, безкрайни вариации, които могат да бъдат опаковани във вашия подсказки. Почти всякакъв вид текстови данни могат да бъдат добавени и разработчиците на bash имат десетилетия да добавят функционалност. Някои читатели дори коментираха за пускането на персонализирани Python или Ruby скриптове в рамките на подканата. Каквото и да правите, направете го функционален и ако е наистина страхотно, пуснете ни линк в коментарите!