En stund tillbaka noterade vi 8 användbara och intressanta basprompter. Det visade sig vara en av våra mest populära artiklar, och genererar fortfarande användarrespons och feedback. Den här gången har vi hittat några fler ädelstenar, liksom några praktiska tips och tricks för att ha den coolaste skalprompten på det proverbiella blocket.

Använda dessa prompter

Några av följande anvisningar är en-liners, och kan klistras direkt i din terminal för (tillfällig) användning. För att göra dem permanenta måste du klistra in koden i din .bashrc eller .bash_profile .

De större, mer komplexa prompten som Twtty bör sparas i sin egen skriptfil (som myprompt.sh), och du lägger en linje som

 källa myprompt.sh 

i din .basrc-fil för att "importera" dem.

Twtty Prompt

Detta är en tvåstegsprompt som innehåller en hel del information, inklusive användarnamn, värdnamn, arbetsbok, tid och kommandonhistoriknummer. På grund av den tekniska och visuella komplexiteten är det bäst att placera det här skriptet i sin egen fil och sedan källa det från .bashrc eller .bash_profile som beskrivet ovan.

 funktion prompt_command {TERMWIDTH = $ {COLUMNS} # Beräkna bredden på prompten: hostnam = $ (echo -n $ HOSTNAME | sed -e "s /[\.].*//") # "whoami" och "pwd "include a trailing newline usernam = $ (whoami) cur_tty = $ (tty | sed -e" s /.* tty \ (. * \) / \ 1 / ") newPWD =" $ {PWD} "# Lägg till alla tillbehör nedan ... låt promptsize = $ (echo -n "- ($ {usernam} @ $ {hostnam}: $ {cur_tty}) --- ($ {PWD}) -" \ | wc -c | tr -d "") låt fyllas = $ {TERMWIDTH} - $ {promptsize} fill = "" medan ["$ fill-up" -gt "0"] fyller = "$ {fill} -" låt fyllas = $ {fyll } -1 gjort om ["$ fillsize" -lt "0"] låt sedan klippa = 3 - $ {fillsize} newPWD = "... $ (echo -n $ PWD | sed -e" s / \ (^. \ {$ cut \} \) \ (. * \) / \ 2 / ")" fi} PROMPT_COMMAND = prompt_command funktion twtty {lokala GRAY = "\ [\ 033 [1; 30m \]" local LIGHT_GRAY = "\ \ 033 [0; 37m \] "local WHITE =" \ [\ 033 [1; 37m \] "lokala NO_COLOUR =" \ [\ 033 [0m \] "lokala LIGHT_BLUE =" \ [\ 033 [1; 34m \ ] "local YELLOW =" \ [\ 033 [1; 33m \] "fallet $ 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 \ $ (datum +% H% M) $ LIGHT_BLUE: $ GUL \ $ (datum \ "+% a, % d% b% y \") \ $ LIGHT_BLUE: $ WHITE \ $$ LIGHT_BLUE) - \ $ GUL- \ $ NO_COLOUR "PS2 =" $ LIGHT_BLUE- $ GUL- $ GUL- $ NO_COLOUR "} 

En viktig sak att notera om denna prompten är att den vågräta streckvågorna anpassas till bredden på din terminal och att arbetsmappslinjen kommer att stympa sig när den blir för stor.

Om du har några problem med ovanstående kodsedel kan du hämta textversionen här.

Högpresterande minimala prompten

Alla komplexiteter av en snygg promps som Twtty tar upp extra CPU-cykler, och det kommer definitivt inte att slipa ditt system till ett stopp, det kan lägga till. Om du vill ha något som packar mycket info utan att sakta ner dig, föreslår jag det här:

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

En intressant sak att notera här är användningen av variabeln $? i slutet. Detta betyder utgångsstatus för det sista kommandot som har angetts. 0 betyder att allt är bra, vilket som helst annat tal brukar indikera ett fel.

Robs Prompt

Detta är en av de mer populära frågorna som flyter runt på Internet. Koden är liten och enkel, men den ger många av de funktioner som finns i de större, mer komplexa exemplen.

 PS1 = "\ [\ 033 [0; 33m \] [\!] \` Om [[\ $? = "0"]]; sedan echo "\\ [\\ 033 [32m \\]" "\\ [\\ 033 [31m \\]"; fi \ `[\ u. \ H: \` om [[`pwd | wc -c | tr -d '" `> 18]] och sedan echo" \\ W ", annars eko" \\ w "; fi \`] \ $ \ [\ 033 [0m \] "; echo -ne "\ 033] 0;` värdnamn -s`: `pwd` \ 007" 

MegaFancyPrompt

Namnet är helt förtjänade - den här prompten är ganska stor och extremt snygg. Det har färg, kontrollpanel, användarmedvetenhet, proxysökning, skärmdetektering, antal jobb och mer. Kort sagt, bara om alla funktioner som finns i de andra prompterna vi har nämnt finns här och en hel del andra. Om du vill ha det ALLA i din snabba, så är det här.

Obs! Det är inte alltid alla funktioner som syns, så det kan inte se ut så mycket i skärmdumpen, men du kan kolla in den fullständiga (dokumenterade, kommenterade) skriptfilen här för detaljer om hur du får de synliga delarna du vill ha.

 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 för att ställa prompt_command till. funktionen promptcmd () {historia-en lokal SSH_FLAG = 0 lokal TTY = $ (tty | awk -F / dev / '{skriv ut $ 2}') om [[$ {TTY}]]; sedan lokal SESS_SRC = $ (som | grep "$ TTY" | awk '{skriv ut $ 6}') fi # Titelfältet $ {TERM} i xterm *) local TITLEBAR = '\ [\ 033] 0; \ u @ \ h : {\ w} \ 007 \] ';; *) local TITLEBAR = '' ;; esac PS1 = "$ {TITLEBAR}" # Test för dagändring. om [-z $ DAY]; sedan exportera DAY = $ (datum +% A) annat lokalt idag = $ (datum +% A) om ["$ {DAY}"! = "$ {today}"]; då ändrades PS1 = "$ {PS1} \ n \ [$ {COLOR_GREEN} \] dagen till $ (datum '+% A, % d% B% Y'). \ n" export DAY = $ idag fi fi # Användare om [$ {UID} -eq 0]; då om ["$ {USER}" == "$ {LOGNAME}"]; då om [[$ {SUDO_USER}]]; PS1 = "$ {PS1} \ [$ {COLOR_LIGHTRED} \] \ u" {COLOR_YELLOW} \] \ u "fi annars om [$ {USER} == $ {LOGNAME}]; då är PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \] \ u" annat PS1 = "$ {PS1} \ [$ {COLOR_BROWN} \] \ u" fi fi # HTTP Proxy konfigurerat eller inte om [ n "$ http_proxy"]; då PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \] @" annat PS1 = "$ {PS1} \ [$ {COLOR_LIGHTRED} \] @" fi # Host om [[$ {SSH_CLIENT}] | [[$ {SSH2_CLIENT}]]; sedan SSH_FLAG = 1 fi om [$ {SSH_FLAG} -eq 1]; sedan PS1 = "$ {PS1} \ [$ {COLOR_CYAN} \] \ h" elif [[-n $ {SESS_SRC}]]; sedan om ["$ {SESS_SRC}" == "(: 0.0)"]; PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \] \ h" annars lokala parent_process = `cat / proc / $ {PPID} / cmdline` om [[" $ parent_process "==" in.rlogind * " ]]; sedan PS1 = "$ {PS1} \ [$ {COLOR_BROWN} \] \ h" elif [["$ parent_process" == "in.telnetd *"]]; sedan PS1 = "$ {PS1} \ [$ {COLOR_YELLOW} \] \ h" else PS1 = "$ {PS1} \ [$ {COLOR_LIGHTRED} \] \ h" fi fi el [["$ {SESS_SRC}" = = ""]]; sedan PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \] \ h" else PS1 = "$ {PS1} \ [$ {COLOR_RED} \] \ h" fi # Friliggande skärm sessioner lokal DTCHSCRN = $ ls | grep -c Detach) om [$ {DTCHSCRN} -gt 2]; sedan PS1 = "$ {PS1} \ [$ {COLOR_RED} \] [scr: $ {DTCHSCRN}]" elif [$ {DTCHSCRN} -gt 0]; PS1 = "$ {PS1} \ [$ {COLOR_YELLOW} \] [scr: $ {DTCHSCRN}]" fi # Bakgrundade löpande jobb lokala BKGJBS = $ (jobb -r | wc -l) om [$ {BKGJBS} gt2]; sedan PS1 = "$ {PS1} \ [$ {COLOR_RED} \] [bg: $ {BKGJBS}]" elif [$ {BKGJBS} -gt 0]; PS1 = "$ {PS1} \ [$ {COLOR_YELLOW} \] [bg: $ {BKGJBS}]" fi # Stoppade jobb lokala STPJBS = $ (jobb -s | wc -l) om [$ {STPJBS} 2]; sedan PS1 = "$ {PS1} \ [$ {COLOR_RED} \] [stp: $ {STPJBS}]" elif [$ {STPJBS} -gt 0]; sedan PS1 = "$ {PS1} \ [$ {COLOR_YELLOW} \] [stp: $ {STPJBS}]" fi # Fäste {om [$ {UID} -eq 0]; då om ["$ {USER}" == "$ {LOGNAME}"]; då om [[$ {SUDO_USER}]]; PS1 = "$ {PS1} \ [$ {COLOR_RED} \]" ] "fi om [" $ {USER} "==" $ {LOGNAME} "]; då PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \]" annars PS1 = "$ {PS1} \ [$ {COLOR_BROWN} \]" fi fi PS1 = "$ {PS1} -w "$ {PWD}"]; då PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \] $ (prompt_workingdir)" annars PS1 = "$ {PS1} \ [$ {COLOR_RED} \] $ (prompt_workingdir)" fi # Stängningsfäste} och $ \ # om [$ {UID} -eq 0]; då om ["$ {USER}" == "$ {LOGNAME}"]; då om [[$ {SUDO_USER}]]; PS1 = "$ {PS1} \ [$ {COLOR_RED} \]" ] "fi om [" $ {USER} "==" $ {LOGNAME} "]; sedan PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \]" annat PS1 = "$ {PS1} \ [$ {COLOR_BROWN} \]" fi fi PS1 = "$ {PS1}} \ $ \ [$ { COLOR_DEFAULT} \] "} Trimning fungerar dir till 1/4 skärmbreddsfunktionen prompt_workingdir () {local pwdmaxlen = $ (($ COLUMNS / 4)) local trunc_symbol =" ... "om [[$ PWD == $ HEM* ]]; sedan newPWD = "~ $ {PWD # $ HOME}" annars newPWD = $ {PWD} fi om [$ {# newPWD} -gt $ pwdmaxlen]; sedan pwdoffset = $ (($ {# newPWD} - $ pwdmaxlen + 3)) newPWD = "$ {trunc_symbol} $ {newPWD: $ pwdoffset: $ pwdmaxlen}" fi echo $ newPWD} # Bestäm vilken prompt att visa: 1. Visa enkel anpassad prompten för skalsessioner startade # med script. # 2. Visa "blid" -prompt för shell sessioner inom emacs eller # xemacs. # 3 Visa promptcmd för alla andra fall. funktion load_prompt () {# Hämta PIDs local parent_process = $ (cat / proc / $ PPID / cmdline | cut -d \. -f 1) local my_process = $ (cat / proc / $$ / cmdline | cut -d \. -f 1) om [[$ parent_process == script *]]; då PROMPT_COMMAND = "" PS1 = "\ t - \ # - \ u @ \ H {\ w} \ $" elif [[$ parent_process == emacs * || $ parent_process == xemacs *]]; sedan PROMPT_COMMAND = "" PS1 = "\ u @ \ h {\ w} \ $" Annan exportera DAY = $ (datum +% A) PROMPT_COMMAND = promptcmd fi export PS1 PROMPT_COMMAND} load_prompt 

Bonus - Hitta rätt färger

Som du kanske har lagt märke till, använder de flesta av dessa färg, och färgen representeras ofta i kodad form som "\ 033 [1; 30m ', vilket är ganska svårt att läsa eller komma ihåg. Ett enkelt sätt att se alla dina tillgängliga färger och förhandsgranska hur de kommer att se ut är att helt enkelt klistra in följande kod i din webbläsare:

 för jag i `Seq 1 7; seq 30 48; seq 90 107`; gör echo -e "\ e [$ {i} mtest \ e [0m $ i" gjort 

Vilket kommer att mata ut varje färgkod med sitt nummer.

Slutsats

Det finns naturligtvis oändliga variationer som kan packas in i din prompten. Nästan alla slags textdata kan läggas till, och bashs utvecklare har haft decennier att lägga till i funktionalitet. Vissa läsare har även kommenterat att köra anpassade Python- eller Ruby-skript från inbjudan. Oavsett vad du gör, gör det funktionellt, och om det är riktigt coolt, släpp oss en länk i kommentarerna!