En stund tilbake, oppført vi 8 nyttige og interessante Bash Prompts. Det viste seg å være en av våre mest populære artikler, og fremmer fortsatt brukerrespons og tilbakemelding. Denne gangen har vi funnet noen flere perler, i tillegg til noen hendige tips og triks for å ha det kuleste shell-spørsmålet på den ordspråklige blokken.

Bruke disse spørsmålene

Noen av følgende instruksjoner er en-liners, og kan limes direkte inn i terminalen din for midlertidig bruk. For å gjøre dem permanente må du lime inn koden i .bashrc eller .bash_profile .

De større, mer komplekse instruksjonene som Twtty skal lagres i egen skriptfil (for eksempel myprompt.sh), og du plasserer en linje som

 kilde myprompt.sh 

i .basrc-filen din for å "importere" dem.

Twtty Prompt

Dette er en to-linjers spørring som inneholder ganske mye informasjon, inkludert brukernavn, vertsnavn, arbeidskatalog, tid og kommandolinjens nummer. På grunn av den tekniske og visuelle kompleksiteten, er det best å plassere dette ledende skriptet i sin egen fil, og kild det fra .bashrc eller .bash_profile som beskrevet ovenfor.

 funksjon prompt_command {TERMWIDTH = $ {COLUMNS} # Beregn bredden på spørringen: hostnam = $ (echo -n $ HOSTNAME | sed -e "s /[\.].*//") # "whoami" og "pwd "inkludere en tilhørende newline usernam = $ (whoami) cur_tty = $ (tty | sed -e" s /.* tty \ (. * \) / \ 1 / ") newPWD =" $ {PWD} "# Legg til alle tilbehør nedenfor ... la beskjed = $ (echo -n "- ($ {usernam} @ $ {hostnam}: $ {cur_tty}) --- ($ {PWD}) -" \ | wc -c | tr -d "") la fylle = $ {TERMWIDTH} - $ {promptsize} fill = "" mens ["$ fillsize" -gt "0"] fill = "$ {fill} -" la fillsize = $ {fill } -1 gjort hvis ["$ fillsize" -lt "0"] la deretter kutte = 3 - $ {fillsize} newPWD = "... $ (echo -n $ PWD | sed -e" s / \ (^. \ {$ cut \} \) \ (. * \) / \ 2 / ")" fi} PROMPT_COMMAND = prompt_command funksjon 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 \ ] "lokal GUL =" \ [033 [1; 33m \] "tilfelle $ 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 viktig ting å merke seg om denne prompten er at den horisontale stangen skalerer slik at den passer til bredden på terminalen din, og at arbeidskataloglinjen vil avkorte seg når den blir for stor.

Hvis du har noen problemer med det ovennevnte kodestykket, kan den enkle tekstversjonen lastes ned her.

Høy ytelse minimalistisk spørsmål

Alle kompleksiteten til en fancy spørsmål som Twtty tar opp ekstra CPU-sykluser, og mens det absolutt ikke kommer til å slipe systemet ditt, kan det legge til. Hvis du vil ha noe som pakker mye info uten å bremse deg ned, foreslår jeg dette:

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

En interessant ting å merke seg her er bruken av variablen $? på slutten. Dette betyr utgangsstatus for den siste kommandoen som er angitt. 0 betyr alt er bra, noe annet tall indikerer vanligvis en feil.

Robs Prompt

Dette er en av de mest populære meldingene som flyter rundt på Internett. Koden er liten og enkel, men den gir mange av funksjonene som finnes i de større, mer komplekse eksemplene.

 PS1 = "\ [\ 033 [0; 33m \] [\!] \` Hvis [[\ $? = "0"]]; ekko deretter "\\ [\\ 033 [32m \\]"; "\\ [\\ 033 [31m \\]"; fi \ `[\ u. \ H: \` hvis [[`pwd | wc -c | tr -d '" `> 18]], og deretter ekko" \\ W "; annet ekko" \\ w "; fi \`] \ $ \ [\ 033 [0m \] "; ekko -ne "\ 033] 0;` vertsnavn -s`: `pwd` \ 007" 

MegaFancyPrompt

Navnet er helt fortjent - denne meldingen er ganske stor og ekstremt fancy. Den har farge, tittellinjekontroll, brukerbevissthet, proxy deteksjon, skjermdeteksjon, jobbtall og mer. Kort sagt, omtrent alle funksjonene som finnes i de andre spørsmålene vi har nevnt finner du her, og mange andre. Hvis du vil ha det ALLE i din melding, er dette det.

Merk: Ikke alle funksjoner er synlige til enhver tid, så mens det ikke ser ut som mye i skjermbildet, kan du sjekke ut den fullstendige (dokumentert, kommenterte) skriptfilen her for detaljer om hvordan du får de synlige delene du vil 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' # Funksjon for å sette prompt_command til. funksjonen promptcmd () {historie-en lokal SSH_FLAG = 0 lokal TTY = $ (tty | awk -F / dev / '{skriv ut $ 2}') hvis [[$ {TTY}]]; deretter lokal SESS_SRC = $ (hvem | grep "$ TTY" | awk '{skriv ut $ 6}') fi # Tittelbar tilfelle $ {TERM} i xterm *) lokal TITLEBAR = '\ [\ 033] 0; \ u @ \ h : {\ w} \ 007 \] ';; *) lokal TITLEBAR = '' ;; esac PS1 = "$ {TITLEBAR}" # Test for dagendring. hvis [-z $ DAY]; eksporter deretter DAY = $ (dato +% A) ellers lokal i dag = $ (dato +% A) hvis ["$ {DAY}"! = "$ {today}"]; da ble PS1 = "$ {PS1} \ n \ [$ {COLOR_GREEN} \] dagen endret til $ (dato '+% A, % d% B% Y'). \ n" eksport DAY = $ i dag fi fi # Bruker hvis [$ {UID} -eq 0]; så hvis ["$ {USER}" == "$ {LOGNAME}"]; så hvis [[$ {SUDO_USER}]]; PS1 = "$ {PS1} \ [$ {COLOR_LIGHTRED}} \" {COLOR_YELLOW} \] \ u "fi else hvis [$ {USER} == $ {LOGNAME}]; da er PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \] \ u" annet PS1 = "$ {PS1} \ [$ {COLOR_BROWN} \] \ u" fi fi # HTTP Proxy konfigurert eller ikke hvis [ n "$ http_proxy"]; så PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \] @" annet PS1 = "$ {PS1} \ [$ {COLOR_LIGHTRED} \] @" fi # Host hvis [[$ {SSH_CLIENT}] || [[$ {SSH2_CLIENT}]]; da SSH_FLAG = 1 fi hvis [$ {SSH_FLAG} -eq 1]; så PS1 = "$ {PS1} \ [$ {COLOR_CYAN} \] \ h" elif [[-n $ {SESS_SRC}]]; så hvis ["$ {SESS_SRC}" == "(: 0.0)"]; så er PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \] \ h" andre lokale parent_process = `cat / proc / $ {PPID} / cmdline` hvis [[" $ parent_process "==" in.rlogind * ]]; så PS1 = "$ {PS1} \ [$ {COLOR_BROWN} \] \ h" elif [["$ parent_process" == "in.telnetd *"]]; så PS1 = "$ {PS1} \ [$ {COLOR_YELLOW} \] \ h" else PS1 = "$ {PS1} \ [$ {COLOR_LIGHTRED} \] \ h" fi fi elif [["$ {SESS_SRC}" = = ""]]; så PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \] \ h" else PS1 = "$ {PS1} \ [$ {COLOR_RED} \] \ h" fi # Frittstående skjermsessioner lokale DTCHSCRN = $ ls | grep -c Detach) hvis [$ {DTCHSCRN} -gt 2]; så PS1 = "$ {PS1} \ [$ {COLOR_RED} \] [scr: $ {DTCHSCRN}]" elif [$ {DTCHSCRN} -gt 0]; da = PS1 = "$ {PS1} \ [$ {COLOR_YELLOW} \] [scr: $ {DTCHSCRN}]" fi # Bakgrunnsbilder med kjørende jobber lokal BKGJBS = $ (jobber -r | wc -l) hvis [$ {BKGJBS} gt 2]; så PS1 = "$ {PS1} \ [$ {COLOR_RED} \] [bg: $ {BKGJBS}]" elif [$ {BKGJBS} -gt 0]; så er PS1 = "$ {PS1} \ [$ {COLOR_YELLOW} \] [bg: $ {BKGJBS}]" fi # Stoppede jobber lokale STPJBS = $ (jobber -s | wc -l) hvis [$ {STPJBS} 2]; så PS1 = "$ {PS1} \ [$ {COLOR_RED} \] [stp: $ {STPJBS}]" elif [$ {STPJBS} -gt 0]; så PS1 = "$ {PS1} \ [$ {COLOR_YELLOW} \] [stp: $ {STPJBS}]" fi # Bracket {hvis [$ {UID} -eq 0]; så hvis ["$ {USER}" == "$ {LOGNAME}"]; så hvis [[$ {SUDO_USER}]]; så PS1 = "$ {PS1} \ [$ {COLOR_RED} \]" annet PS1 = "$ {PS1} \ [$ {COLOR_LIGHTRED} \]" fi else PS1 = "$ {PS1} \ [$ {COLOR_YELLOW} \ ] "fi else hvis [" $ {USER} "==" $ {LOGNAME} "]; så PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \]" annet PS1 = "$ {PS1} \ [$ {COLOR_BROWN} \]" fi fi PS1 = "$ {PS1} -w "$ {PWD}"]; så PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \] $ (prompt_workingdir)" ellers PS1 = "$ {PS1} \ [$ {COLOR_RED} \] $ (prompt_workingdir)" fi # Lukkebrakett} og $ \ # hvis [$ {UID} -eq 0]; så hvis ["$ {USER}" == "$ {LOGNAME}"]; så hvis [[$ {SUDO_USER}]]; så PS1 = "$ {PS1} \ [$ {COLOR_RED} \]" annet PS1 = "$ {PS1} \ [$ {COLOR_LIGHTRED} \]" fi else PS1 = "$ {PS1} \ [$ {COLOR_YELLOW} \ ] "fi else hvis [" $ {USER} "==" $ {LOGNAME} "]; så PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \]" annet PS1 = "$ {PS1} \ [$ {COLOR_BROWN} \ fi" PS1 = "$ {PS1}} \ $ \ [$ { COLOR_DEFAULT} \] "# Trim arbeider dir til 1/4 skjermbreddefunksjonen prompt_workingdir () {local pwdmaxlen = $ (($ COLUMNS / 4)) local trunc_symbol =" ... "hvis [[$ PWD == $ HOME *]]; da newPWD = "~ $ {PWD # $ HOME}" annet nyttPWD = $ {PWD} fi hvis [$ {# newPWD} -gt $ pwdmaxlen]; Da er det lokale pwdoffset = $ (($ {# newPWD} - $ pwdmaxlen + 3)) newPWD = "$ {trunc_symbol} $ {newPWD: $ pwdoffset: $ pwdmaxlen}" fi echo $ newPWD} # Bestem hvilken melding som skal vises: 1. Vis enkel tilpasset melding for shell økter startet # ved script. # 2. Vis "blid" ledetråd for shell-økter innen emacs eller # xemacs. # 3 Display promptcmd for alle andre tilfeller. funksjon load_prompt () {# Få PIDs local parent_process = $ (katt / proc / $ PPID / cmdline | cut -d \ .f 1) local my_process = $ (cat / proc / $$ / cmdline | cut -d \. -f 1) hvis [[$ parent_process == script *]]; så PROMPT_COMMAND = "" PS1 = "\ t - \ # - \ u @ \ H {\ w} \ $" elif [[$ parent_process == emacs * || $ parent_process == xemacs *]]; deretter PROMPT_COMMAND = "" PS1 = "\ u @ \ h {\ w} \ $" annet eksporter DAY = $ (dato +% A) PROMPT_COMMAND = promptcmd fi eksport PS1 PROMPT_COMMAND} load_prompt 

Bonus - Finne de riktige farger

Som du kanskje har lagt merke til, advarer de fleste av disse til farge, og fargen er ofte representert i kodet form som '\ 033 [1; 30m', noe som er ganske vanskelig å lese eller huske. En enkel måte å se alle tilgjengelige farger, og forhåndsvise hvordan de skal se ut, er å bare lime inn følgende kode i nettleseren din:

 for jeg er `seq 1 7; seq 30 48; seq 90 107 `; gjør ekko-ei [$ {i} mtest \ e [0m $ i "ferdig 

Hvilket vil sende ut hver fargekode med sitt nummer.

Konklusjon

Det er selvfølgelig uendelige variasjoner som kan pakkes inn i din ledelse. Nesten alle slags tekstdata kan legges til, og bashs utviklere har hatt flere tiår å legge til i funksjonalitet. Noen lesere har selv kommentert om å kjøre egendefinerte Python- eller Ruby-skript innenfor spørringen. Uansett hva du gjør, gjør det funksjonelt, og hvis det er virkelig kult, slipp oss en lenke i kommentarene!