Handigere en interessantere Bash-aanwijzingen
Een tijdje geleden namen we 8 nuttige en interessante bashprompts op. Dat bleek een van onze meest populaire artikelen te zijn en genereert nog steeds gebruikersreacties en feedback. Deze keer hebben we nog een aantal edelstenen gevonden, evenals enkele handige tips en trucs voor het hebben van de coolste shell prompt op het spreekwoordelijke blok.
Deze aanwijzingen gebruiken
Sommige van de volgende aanwijzingen zijn oneliners en kunnen direct in uw terminal worden geplakt voor (tijdelijk) gebruik. Om ze permanent te maken, moet je de code in je .bashrc of .bash_profile plakken.
De grotere, meer complexe aanwijzingen zoals Twtty moeten in hun eigen scriptbestand (zoals myprompt.sh) worden opgeslagen en u plaatst een regel zoals
bron myprompt.sh
in uw .basrc-bestand om ze te "importeren".
Twtty Prompt
Dit is een tweevoudige prompt met nogal wat informatie, waaronder gebruikersnaam, hostnaam, werkdirectory, tijd en opdrachthistorie. Vanwege de technische en visuele complexiteit, is het het beste om dit prompt-script in zijn eigen bestand te plaatsen en het vervolgens te sourcen vanuit uw .bashrc of .bash_profile, zoals hierboven beschreven.
function prompt_command {TERMWIDTH = $ {COLUMNS} # Bereken de breedte van de prompt: hostnam = $ (echo -n $ HOSTNAME | sed -e "s /[\.].*//") # "whoami" en "pwd "include een trailing newline usernam = $ (whoami) cur_tty = $ (tty | sed -e" s /.* tty \ (. * \) / \ 1 / ") newPWD =" $ {PWD} "# Alle toevoegen onderstaande accessoires ... laat promptsize = $ (echo -n "- ($ {usernam} @ $ {hostnam}: $ {cur_tty}) --- ($ {PWD}) -" \ | wc -c | tr -d "") laat fillsize = $ {TERMWIDTH} - $ {promptsize} fill = "" while ["$ fillsize" -gt "0"] do fill = "$ {fill} -" let fillsize = $ {fillsize } -1 gedaan als ["$ fillsize" -lt "0"] dan laten knippen = 3 - $ {fillsize} newPWD = "... $ (echo -n $ PWD | sed -e" s / \ (^. \ {$ cut \} \) \ (. * \) / \ 2 / ")" fi} PROMPT_COMMAND = prompt_command functie twtty {local GRAY = "\ [\ 033 [1; 30m \]" local LIGHT_GRAY = "\ [ \ 033 [0; 37m \] "local WHITE =" \ [\ 033 [1; 37m \] "local NO_COLOUR =" \ [\ 033 [0m \] "local LIGHT_BLUE =" \ [\ 033 [1; 34m \ ] "local YELLOW =" \ [\ 033 [1; 33m \] "case $ TERM in xterm *) TITLEBAR = '\ [\ 033] 0; \ u @ \ h: \ w \ 007 \]' ;; *) TITLEBAR = "" ;; esac PS1 = "$ TITLEBAR \ $ GEEL- $ LIGHT_BLUE - (\ $ GEEL \ $ usernam $ LIGHT_BLUE @ $ GEEL \ $ hostnam $ LIGHT_BLUE: $ WHITE \ $ cur_tty \ $ {LIGHT_BLUE}) - $ {GEEL} - \ $ {fill} $ {LIGHT_BLUE} - (\ $ YELLOW \ $ {newPWD} \ $ LIGHT_BLUE) - $ YELLOW- \ \ n \ $ YELLOW- $ LIGHT_BLUE - (\ $ YELLOW \ $ (datum +% H% M) $ LIGHT_BLUE: $ YELLOW \ $ (datum \ "+% a, % d% b% y \") \ $ LIGHT_BLUE: $ WHITE \ $$ LIGHT_BLUE) - \ $ YELLOW- \ $ NO_COLOUR "PS2 =" $ LIGHT_BLUE- $ GEEL- GEEL- $ NO_COLOUR "}
Een belangrijk ding om op te merken over deze prompt is dat de horizontale balk wordt geschaald om in de breedte van uw terminal te passen, en dat de werkdirectorylijn zichzelf zal afkappen wanneer deze te groot wordt.
Als u problemen ondervindt met het bovenstaande codefragment, kunt u de tekstversie hier downloaden.
High-Performance Minimalist Prompt
Alle complexiteiten van een fraaie prompt als Twtty nemen wel extra CPU-cycli in beslag, en hoewel het je systeem zeker niet tot stilstand zal brengen, kan het oplopen. Als u iets wilt dat veel informatie bevat zonder u te vertragen, stel ik dit voor:
PS1 = "[\ d | \ T -> \ w ... \ $?] \ N #"
Een interessant ding om op te merken hier is het gebruik van de variabele $? aan het einde. Dit betekent de eindstatus van de laatst ingevoerde opdracht. 0 betekent dat alles goed gaat, elk ander nummer duidt meestal op een fout.
Rob's vraag
Dit is een van de meer populaire aanwijzingen die rondzweven op internet. De code is klein en eenvoudig, maar het geeft veel van de functies die te vinden zijn in de grotere, meer complexe voorbeelden.
PS1 = "\ [\ 033 [0; 33m \] [\!] \` If [[\ $? = "0"] echo "\\ [\\ 033 [32m \\]"; anders echo "\\ [\\ 033 [31m \\]"; fi \ `[\ u. \ H: \` if [[`pwd | wc -c | tr -d" "`> 18]]; echo vervolgens " \\ W "; anders echo" \\ w "; fi \`] \ $ \ [\ 033 [0m \] "; echo -ne "\ 033] 0;` hostname -s`: `pwd` \ 007"
MegaFancyPrompt
De naam is volledig verdiend - deze prompt is vrij groot en buitengewoon chique. Het heeft kleur, titelbalkcontrole, gebruikersbewustzijn, proxy-detectie, schermdetectie, aantal taken en meer. Kortom, zowat elke functie die wordt gevonden in de andere prompts die we hebben genoemd, is hier te vinden, en een flink aantal andere. Als u het ALLEMAAL in uw prompt wilt, is dit het.
Opmerking: niet alle functies zijn te allen tijde zichtbaar, dus hoewel het er in de schermafbeelding mogelijk niet zo veel uit ziet, kunt u hier het volledige (gedocumenteerde, becommentarieerde) scriptbestand bekijken voor informatie over hoe u de zichtbare onderdelen kunt krijgen die u wilt.
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' # Functie om prompt_opdracht in te stellen. function promptcmd () {history -a local SSH_FLAG = 0 local TTY = $ (tty | awk -F / dev / '{print $ 2}') als [[$ {TTY}]]; dan lokaal SESS_SRC = $ (who | grep "$ TTY" | awk '{print $ 6}') fi # Titel van titelbar $ {TERM} in xterm *) local TITLEBAR = '\ [\ 033] 0; \ u @ \ h : {\ w} \ 007 \] ';; *) lokale TITLEBAR = '' ;; esac PS1 = "$ {TITLEBAR}" # Test voor dagwisseling. als [-z $ DAY]; exporteer dan DAY = $ (datum +% A) anders lokaal vandaag = $ (datum +% A) als ["$ {DAY}"! = "$ {today}"]; dan PS1 = "$ {PS1} \ n \ [$ {COLOR_GREEN} \] Dag veranderd in $ (datum '+% A, % d% B% Y'). \ n" export DAY = $ vandaag fi fi # Gebruiker als [$ {UID} -eq 0]; dan als ["$ {USER}" == "$ {LOGNAME}"]; dan als [[$ {SUDO_USER}]]; dan PS1 = "$ {PS1} \ [$ {COLOR_RED} \] \ u" else PS1 = "$ {PS1} \ [$ {COLOR_LIGHTRED} \] \ u" fi else PS1 = "$ {PS1} \ [$ {COLOR_YELLOW} \] \ u "fi else if [$ {USER} == $ {LOGNAME}]; dan PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \] \ u" else PS1 = "$ {PS1} \ [$ {COLOR_BROWN} \] \ u" fi fi # HTTP Proxy var geconfigureerd of niet als [- n "$ http_proxy"]; dan PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \] @" else PS1 = "$ {PS1} \ [$ {COLOR_LIGHTRED} \] @" fi # Host als [[$ {SSH_CLIENT}]] || [[$ {SSH2_CLIENT}]]; dan SSH_FLAG = 1 fi als [$ {SSH_FLAG} -eq 1]; dan PS1 = "$ {PS1} \ [$ {COLOR_CYAN} \] \ h" elif [[-n $ {SESS_SRC}]]; dan als ["$ {SESS_SRC}" == "(: 0.0)"]; dan PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \] \ h" else local parent_process = `cat / proc / $ {PPID} / cmdline` if [[" $ parent_process "==" in.rlogind * " ]]; dan PS1 = "$ {PS1} \ [$ {COLOR_BROWN} \] \ h" elif [["$ parent_process" == "in.telnetd *"]]; dan PS1 = "$ {PS1} \ [$ {COLOR_YELLOW} \] \ h" else PS1 = "$ {PS1} \ [$ {COLOR_LIGHTRED} \] \ h" fi fi elif [["$ {SESS_SRC}" = = ""]]; dan PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \] \ h" else PS1 = "$ {PS1} \ [$ {COLOR_RED} \] \ h" fi # Vrijstaande scherm Sessies lokaal DTCHSCRN = $ (scherm - ls | grep -c Detach) als [$ {DTCHSCRN} -gt 2]; dan PS1 = "$ {PS1} \ [$ {COLOR_RED} \] [scr: $ {DTCHSCRN}]" elif [$ {DTCHSCRN} -gt 0]; dan PS1 = "$ {PS1} \ [$ {COLOR_YELLOW} \] [scr: $ {DTCHSCRN}]" fi # Achtergrond lopende opdrachten lokaal BKGJBS = $ (jobs -r | wc -l) if [$ {BKGJBS} - gt 2]; dan PS1 = "$ {PS1} \ [$ {COLOR_RED} \] [bg: $ {BKGJBS}]" elif [$ {BKGJBS} -gt 0]; dan PS1 = "$ {PS1} \ [$ {COLOR_YELLOW} \] [bg: $ {BKGJBS}]" fi # Gestopte banen lokale STPJBS = $ (jobs -s | wc -l) als [$ {STPJBS} -gt 2]; dan PS1 = "$ {PS1} \ [$ {COLOR_RED} \] [stp: $ {STPJBS}]" elif [$ {STPJBS} -gt 0]; dan PS1 = "$ {PS1} \ [$ {COLOR_YELLOW} \] [stp: $ {STPJBS}]" fi # Bracket {if [$ {UID} -eq 0]; dan als ["$ {USER}" == "$ {LOGNAME}"]; dan als [[$ {SUDO_USER}]]; dan PS1 = "$ {PS1} \ [$ {COLOR_RED} \]" else PS1 = "$ {PS1} \ [$ {COLOR_LIGHTRED} \]" fi else PS1 = "$ {PS1} \ [$ {COLOR_YELLOW} \ ] "fi else if [" $ {USER} "==" $ {LOGNAME} "]; dan PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \]" else PS1 = "$ {PS1} \ [$ {COLOR_BROWN} \]" fi fi PS1 = "$ {PS1} {" # werkdirectory als [ -w "$ {PWD}"]; dan PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \] $ (prompt_workingdir)" else PS1 = "$ {PS1} \ [$ {COLOR_RED} \] $ (prompt_workingdir)" fi # Closing bracket} en $ \ # if [$ {UID} -eq 0]; dan als ["$ {USER}" == "$ {LOGNAME}"]; dan als [[$ {SUDO_USER}]]; dan PS1 = "$ {PS1} \ [$ {COLOR_RED} \]" else PS1 = "$ {PS1} \ [$ {COLOR_LIGHTRED} \]" fi else PS1 = "$ {PS1} \ [$ {COLOR_YELLOW} \ ] "fi else if [" $ {USER} "==" $ {LOGNAME} "]; dan PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \]" else PS1 = "$ {PS1} \ [$ {COLOR_BROWN} \]" fi fi PS1 = "$ {PS1}} \ $ \ [$ { COLOR_DEFAULT} \] "} # Trim werkmap naar 1/4 van de schermbreedte-functie prompt_workingdir () {local pwdmaxlen = $ ($ COLUMNS / 4)) local trunc_symbol =" ... "if [[$ PWD == $ HUIS* ]]; then newPWD = "~ $ {PWD # $ HOME}" else newPWD = $ {PWD} fi if [$ {# newPWD} -gt $ pwdmaxlen]; dan lokale pwdoffset = $ ($ {# newPWD} - $ pwdmaxlen + 3)) newPWD = "$ {trunc_symbol} $ {newPWD: $ pwdoffset: $ pwdmaxlen}" fi echo $ newPWD} # Bepaal welke prompt moet worden weergegeven: # 1. Geef een eenvoudige aangepaste prompt weer voor shell-sessies die # by script zijn gestart. # 2. Geef de "flauwe" prompt weer voor shell-sessies binnen emacs of # xemacs. # 3 Toon promptcmd voor alle andere gevallen. function load_prompt () {# Ontvang PID's local parent_process = $ (cat / proc / $ PPID / cmdline | cut -d \. -f 1) local my_process = $ (cat / proc / $$ / cmdline | cut -d \. -f 1) als [[$ parent_process == script *]]; then PROMPT_COMMAND = "" PS1 = "\ t - \ # - \ u @ \ H {\ w} \ $" elif [[$ parent_process == emacs * || $ parent_process == xemacs *]]; then PROMPT_COMMAND = "" PS1 = "\ u @ \ h {\ w} \ $" else export DAY = $ (datum +% A) PROMPT_COMMAND = promptcmd fi export PS1 PROMPT_COMMAND} load_prompt
Bonus - De juiste kleuren vinden
Zoals je misschien hebt gemerkt, gebruiken de meeste van deze prompts kleur, en de kleur wordt vaak weergegeven in een gecodeerde vorm zoals '\ 033 [1; 30m' ', wat behoorlijk moeilijk te lezen of te onthouden is. Een eenvoudige manier om al uw beschikbare kleuren te bekijken en een voorbeeld te bekijken van hoe ze er uitzien, is door het volgende fragment eenvoudig in uw browser te plakken:
voor i in `seq 17; volg 30 48; volg 90 107 `; doe echo -e "\ e [$ {i} mtest \ e [0m $ i" klaar
Welke elke kleurcode met zijn nummer zal uitvoeren.
Conclusie
Er zijn natuurlijk oneindige variaties die in je prompt kunnen worden ingepakt. Bijna elk soort tekstuele gegevens kan worden toegevoegd, en de ontwikkelaars van bash hebben tientallen jaren gehad om functionaliteit toe te voegen. Sommige lezers hebben zelfs gereageerd over het uitvoeren van aangepaste Python- of Ruby-scripts vanuit de prompt. Wat je ook doet, maak het functioneel, en als het echt HEEL cool is, stuur ons dan een link in de reacties!