Et stykke tid tilbage, vi opregnede 8 nyttige og interessante Bash Prompts. Det viste sig at være en af ​​vores mest populære artikler, og genererer stadig brugersvar og feedback. Denne gang har vi fundet et par flere ædelstene, samt nogle nyttige tips og tricks for at have den fedeste shell prompt på den proverbielle blok.

Brug af disse prompter

Nogle af følgende beskeder er one-liners, og kan indsættes direkte i din terminal til (midlertidig) brug. For at gøre dem permanente skal du indsætte koden i din .bashrc eller .bash_profile .

De større, mere komplekse beskeder, som f.eks. Twtty, skal gemmes i deres egen scriptfil (som myprompt.sh), og du placerer en linje som

 kilde myprompt.sh 

i din .basrc-fil for at "importere" dem.

Twtty Prompt

Dette er en to-linjers prompte, der indeholder en hel del oplysninger, herunder brugernavn, værtsnavn, arbejdsmappe, tid og kommandolinjens nummer. På grund af den tekniske og visuelle kompleksitet er det bedst at placere dette prompt script i sin egen fil, så hent det fra din .bashrc eller .bash_profile som beskrevet ovenfor.

 funktion prompt_command {TERMWIDTH = $ {COLUMNS} # Beregn bredden på prompten: hostnam = $ (echo -n $ HOSTNAME | sed -e "s /[\.].*//") # "whoami" og "pwd "inkludere en efterfølgende newline usernam = $ (whoami) cur_tty = $ (tty | sed -e" s /.* tty \ (. * \) / \ 1 / ") newPWD =" $ {PWD} "# Tilføj alle tilbehør nedenfor ... lad besked = $ (echo -n "- ($ {usernam} @ $ {hostnam}: $ {cur_tty}) --- ($ {PWD}) -" \ | wc -c | tr -d "") Lad fyldes = $ {TERMWIDTH} - $ {promptsize} fill = "" mens ["$ fillsize" -gt "0"] gør fill = "$ {fill} -" lad fyldes = $ {fillsize } -1 gjort, hvis ["$ fillsize" -lt "0"] Lad derefter cut = 3 - $ {fillsize} newPWD = "... $ (echo -n $ PWD | sed -e" s / \ (^. \ {$ cut \} \) \ (. * \) / \ 2 / ")" fi} PROMPT_COMMAND = prompt_command funktion twtty {lokal GRAY = "\ [\ 033 [1; 30m \]" lokal LIGHT_GRAY = "\ \ 033 [0; 37m \] "lokal WHITE =" \ [033 [1; 37m \] "lokal NO_COLOUR =" \ [033 [0m \] "lokal LIGHT_BLUE =" \ [\ 033 [1; 34m \ ] "Local YELLOW =" \ [033 [1; 33m \] "tilfælde $ TERM i xterm *) TITLEBAR = '\ [033] 0; \ u @ \ h: \ w \ 007 \]' ;; *) TITLEBAR = "" ;; esac PS1 = "$ TITLEBAR \ $ GUL- $ LIGHT_BLUE - (\ $ GUL \ $ usernam $ LIGHT_BLUE @ $ GUL \ $ hostnam $ LIGHT_BLUE: $ WHITE \ $ cur_tty \ $ {LIGHT_BLUE}) - $ {GUL} - \ $ {fill} $ {LIGHT_BLUE} - (\ $ GUL \ $ {newPWD} \ $ LIGHT_BLUE) - $ GUL- \ \ n \ $ GUL- $ LIGHT_BLUE - (\ $ GUL \ $ (dato +% H% M) $ LIGHT_BLUE: $ GUL \ $ (dato \ "+% a, % d% b% y \") \ $ LIGHT_BLUE: $ WHITE \ $$ LIGHT_BLUE) - \ $ GUL- \ $ NO_COLOUR "PS2 =" $ LIGHT_BLUE- $ GUL- $ GUL- $ NO_COLOUR "} 

En vigtig ting at bemærke om denne prompning er, at den vandrette bjælke skaleres til at passe til din terminals bredde, og at arbejdskataloglinjen vil afkorte sig selv, når den bliver for stor.

Hvis du har problemer med ovennævnte kodestykke, kan den almindelige tekstversion downloades her.

Højtydende minimalistisk prompte

Alle kompleksiteterne i en prangende prompte som Twtty tager ekstra CPU-cyklusser, og selvom det helt sikkert ikke vil slibe dit system, kan det tilføje op. Hvis du vil have noget, der pakker meget info uden at bremse dig ned, foreslår jeg det her:

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

En interessant ting at bemærke her er brugen af ​​variablen $? i slutningen. Dette betyder udgangsstatus for den sidste kommando, der er indtastet. 0 betyder alt er godt, et hvilket som helst andet tal angiver normalt en fejl.

Robs Prompt

Dette er en af ​​de mere populære prompter, der flyder rundt på internettet. Koden er lille og enkel, men den giver mange af de funktioner, der findes i de større, mere komplekse eksempler.

 PS1 = "\ [\ 033 [0; 33m \] [\!] \` Hvis [[\ $? = "0"]]; så ekko "\\ [\\ 033 [32m \\]" "\\ [\\ 033 [31m \\]"; fi \ `[\ u. \ H: \` hvis [[`pwd | wc -c | tr -d" "`> 18]], så ekko " \\ W "; ellers ekko" \\ w "; fi \`] \ $ \ [\ 033 [0m \] "; echo -ne "\ 033] 0;` værtsnavn -s`: `pwd` \ 007" 

MegaFancyPrompt

Navnet er helt fortjent - denne prompten er ret stor og yderst dekorativ. Det har farve, titellinje kontrol, brugerbevidsthed, proxy detektion, skærm detektion, jobtælling og meget mere. Kort sagt, næsten alle funktioner, der findes i de andre beskeder, vi har nævnt, findes her og ganske mange andre. Hvis du vil have det hele i din prompte, så er det det.

Bemærk: Ikke alle funktioner er synlige til enhver tid, så selv om det måske ikke ligner meget i skærmbilledet, kan du tjekke den fulde (dokumenterede, kommenterede) scriptfil her for at få detaljer om, hvordan du får de synlige dele, du ønsker.

 COLOR_WHITE = '\ 033 [1; 37m' COLOR_LIGHTGRAY = '033 [0; 37m' COLOR_GRAY = '\ 033 [1; 30m' COLOR_BLACK = '\ 033 [0; 30m' COLOR_RED = '\ 033 [0; 31m' COLOR_LIGHTRED = '\ 033 [1; 31m' COLOR_GREEN = '\ 033 [0; 32m' COLOR_LIGHTGREEN = '\ 033 [1; 32m' COLOR_BROWN = '\ 033 [0; 33m' COLOR_YELLOW = '\ 033 [1; 33m' COLOR_BLUE = '\ 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' # Funktion til at sætte prompt_command til. funktion promptcmd () {historie-en lokal SSH_FLAG = 0 lokal TTY = $ (tty | awk -F / dev / '{print $ 2}') hvis [[$ {TTY}]]; derefter lokal SESS_SRC = $ (hvem | grep "$ TTY" | awk '{print $ 6}') fi # Titellinje sag $ {TERM} i xterm *) lokal TITLEBAR = '\ [\ 033] 0; \ u @ \ h : {\ w} \ 007 \] ';; *) Local TITLEBAR = '' ;; esac PS1 = "$ {TITLEBAR}" # Test for dagændring. hvis [-z $ DAY]; Udfør derefter DAY = $ (dato +% A) ellers lokal i dag = $ (dato +% A) hvis ["$ {DAY}"! = "$ {today}"]; så blev PS1 = "$ {PS1} \ n \ [$ {COLOR_GREEN} \] dag ændret til $ (dato '+% A, % d% B% Y'). \ n" eksport DAY = $ i dag fi fi # Bruger hvis [$ {UID} -eq 0]; så hvis ["$ {USER}" == "$ {LOGNAME}"]; så hvis [[$ {SUDO_USER}]]; derefter PS1 = "$ {PS1} \ [$ {COLOR_RED} \] \ u" andet PS1 = "$ {PS1} \ [$ {COLOR_LIGHTRED} \] \ u" fi else PS1 = "$ {PS1} \ [$ {COLOR_YELLOW} \] \ u "fi else hvis [$ {USER} == $ {LOGNAME}]; så er PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \] \ u" andet PS1 = "$ {PS1} \ [$ {COLOR_BROWN} \] \ u" fi fi # HTTP Proxy konfigureret eller ej, hvis [ n "$ http_proxy"]; derefter PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \] @" andet PS1 = "$ {PS1} \ [$ {COLOR_LIGHTRED} \] @" fi # Host hvis [[$ {SSH_CLIENT}] || [[$ {SSH2_CLIENT}]]; derefter SSH_FLAG = 1 fi hvis [$ {SSH_FLAG} -eq 1]; derefter PS1 = "$ {PS1} \ [$ {COLOR_CYAN} \] \ h" elif [[-n $ {SESS_SRC}]]; så hvis ["$ {SESS_SRC}" == "(: 0, 0)"]; så er PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \] \ h" andet lokale parent_process = `cat / proc / $ {PPID} / cmdline` hvis [[" $ parent_process "==" in.rlogind * " ]]; derefter PS1 = "$ {PS1} \ [$ {COLOR_BROWN} \] \ h" elif [["$ parent_process" == "in.telnetd *"]]; derefter PS1 = "$ {PS1} \ [$ {COLOR_YELLOW} \] \ h" else PS1 = "$ {PS1} \ [$ {COLOR_LIGHTRED} \] \ h" fi fi elif [["$ {SESS_SRC}" = = ""]]; derefter PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \] \ h" else PS1 = "$ {PS1} \ [$ {COLOR_RED} \] \ h" fi # Afmonterede skærm sessioner lokal DTCHSCRN = $ ls | grep -c Detach) hvis [$ {DTCHSCRN} -gt 2]; derefter PS1 = "$ {PS1} \ [$ {COLOR_RED} \] [scr: $ {DTCHSCRN}]" elif [$ {DTCHSCRN} -gt 0]; derefter PS1 = "$ {PS1} \ [$ {COLOR_YELLOW} \] [scr: $ {DTCHSCRN}]" fi # Baggrundede kørende job lokalt BKGJBS = $ (jobs -r | wc -l) hvis [$ {BKGJBS} - gt 2]; derefter PS1 = "$ {PS1} \ [$ {COLOR_RED} \] [bg: $ {BKGJBS}]" elif [$ {BKGJBS} -gt 0]; så er PS1 = "$ {PS1} \ [$ {COLOR_YELLOW} \] [bg: $ {BKGJBS}]" fi # Stoppede job lokalt STPJBS = $ (jobs -s | wc -l) hvis [$ {STPJBS} 2]; derefter PS1 = "$ {PS1} \ [$ {COLOR_RED} \] [stp: $ {STPJBS}]" elif [$ {STPJBS} -gt 0]; derefter PS1 = "$ {PS1} \ [$ {COLOR_YELLOW} \] [stp: $ {STPJBS}]" fi # Bracket {hvis [$ {UID} -eq 0]; så hvis ["$ {USER}" == "$ {LOGNAME}"]; så hvis [[$ {SUDO_USER}]]; PS1 = "$ {PS1} \ [$ {COLOR_LIGHTRED} \] ] "ellers hvis [" $ {USER} "==" $ {LOGNAME} "]; derefter PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \]" ellers PS1 = "$ {PS1} \ [$ {COLOR_BROWN} \]" fi fi PS1 = "$ {PS1} -w "$ {PWD}"]; derefter PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \] $ (prompt_workingdir)" ellers PS1 = "$ {PS1} \ [$ {COLOR_RED} \] $ (prompt_workingdir)" fi # Lukkekonsol} og $ \ # hvis [$ {UID} -eq 0]; så hvis ["$ {USER}" == "$ {LOGNAME}"]; så hvis [[$ {SUDO_USER}]]; PS1 = "$ {PS1} \ [$ {COLOR_LIGHTRED} \] ] "ellers hvis [" $ {USER} "==" $ {LOGNAME} "]; derefter PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \]" ellers PS1 = "$ {PS1} \ [$ {COLOR_BROWN} \]" fi fi PS1 = "$ {PS1}} \ $ \ [$ { COLOR_DEFAULT} \] "} # Trim arbejder dir til 1/4 skærmbreddefunktionen prompt_workingdir () {local pwdmaxlen = $ (($ COLUMNS / 4)) local trunc_symbol =" ... "hvis [[$ PWD == $ HJEM* ]]; så newPWD = "~ $ {PWD # $ HOME}" ellers newPWD = $ {PWD} fi hvis [$ {# newPWD} -gt $ pwdmaxlen]; derefter lokal pwdoffset = $ (($ {# newPWD} - $ pwdmaxlen + 3)) newPWD = "$ {trunc_symbol} $ {newPWD: $ pwdoffset: $ pwdmaxlen}" fi echo $ newPWD} # Bestem hvilken prompte der skal vises: 1. Vis simpel brugerdefineret prompt til shell sessioner startet # ved script. # 2. Vis "intetsigende" prompt for shell sessioner inden for emacs eller # xemacs. # 3 Vis promptcmd for alle andre tilfælde. funktion load_prompt () {# Få PID'er local parent_process = $ (cat / proc / $ PPID / cmdline | cut -d \ .f 1) local my_process = $ (cat / proc / $$ / cmdline | cut -d \. -f 1) hvis [[$ parent_process == script *]]; derefter PROMPT_COMMAND = "" PS1 = "\ t - \ # - \ u @ \ H {\ w} \ $" elif [[$ parent_process == emacs * || $ parent_process == xemacs *]]; derefter PROMPT_COMMAND = "" PS1 = "\ u @ \ h {\ w} \ $" andet eksporter DAY = $ (dato +% A) PROMPT_COMMAND = promptcmd fi eksport PS1 PROMPT_COMMAND} load_prompt 

Bonus - Find de rigtige farver

Som du måske har bemærket, bruger de fleste af disse besked farve, og farven er ofte repræsenteret i en kodet form som '\ 033 [1; 30m', hvilket er ret vanskeligt at læse eller huske. En nem måde at se alle dine tilgængelige farver på og se, hvordan de vil se ud, er at blot indsætte følgende uddrag i din browser:

 for jeg i `s. 1 7; seq 30 48; seq 90 107 `; gør ekko -e "\ e [$ {i} mtest \ e [0m $ i" færdig 

Hvilket vil sende hver farvekode med sit nummer.

Konklusion

Der er selvfølgelig uendelige variationer, der kan pakkes ind i din hurtige. Næsten enhver form for tekstdata kan tilføjes, og bash's udviklere har haft årtier at tilføje i funktionalitet. Nogle læsere har endda kommenteret at køre brugerdefinerede Python- eller Ruby-scripts fra inden for prompten. Uanset hvad du gør, gør det funktionelt, og hvis det er rigtig cool, slip os et link i kommentarerne!