Nützlicher und Interessanter Bash Prompts
Vor einer Weile haben wir 8 Nützliche und Interessante Bash Prompts aufgelistet. Dies stellte sich als einer unserer beliebtesten Artikel heraus und generiert immer noch Reaktionen und Rückmeldungen der Benutzer. Dieses Mal haben wir ein paar weitere Edelsteine gefunden, sowie einige praktische Tipps und Tricks, um die coolste Shell-Eingabeaufforderung auf dem sprichwörtlichen Block zu bekommen.
Verwenden dieser Eingabeaufforderungen
Einige der folgenden Ansagen sind Einzeiler und können zur vorübergehenden Verwendung direkt in Ihr Terminal eingefügt werden. Um sie dauerhaft zu machen, müssen Sie den Code in Ihre .bashrc oder .bash_profile einfügen .
Die größeren, komplexeren Eingabeaufforderungen wie Twtty sollten in einer eigenen Skriptdatei (z. B. myprompt.sh) gespeichert werden, und Sie platzieren eine ähnliche Zeile
Quelle myprompt.sh
in Ihrer .basrc-Datei, um sie zu "importieren".
Twtty Aufforderung
Dies ist eine zweizeilige Eingabeaufforderung, die ziemlich viele Informationen enthält, einschließlich Benutzername, Hostname, Arbeitsverzeichnis, Uhrzeit und Befehlsverlaufsnummer. Aufgrund der technischen und visuellen Komplexität ist es am besten, dieses Eingabeaufforderungsskript in einer eigenen Datei zu speichern und dann wie oben beschrieben von Ihrer .bashrc- oder .bash_profile- Datei zu beziehen .
Funktion prompt_command {TERMWIDTH = $ {COLUMNS} # Berechne die Breite der Eingabeaufforderung: hostnam = $ (echo -n $ HOSTNAME | sed -e "s /[\.].*//") # "whoami" und "pwd msgstr "fügen Sie eine abschließende neue Zeile ein usernam = $ (whoami) cur_tty = $ (tty | sed -e" s /.* tty \ (. * \) / \ 1 / ") newPWD =" $ {PWD} "# Fügen Sie alle hinzu Zubehör unter ... lass promptsize = $ (echo -n "- ($ {username} @ $ {hostname}: $ {cur_tty}) --- ($ {PWD}) -" \ | wc -c | tr -d "") let fullsize = $ {TERMWIDTH} - $ {prompt} fill = "" while ["$ fullsize" -gt "0"] fill = "$ {fill} -" let fullsize = $ {fullsize } -1 done wenn ["$ fullsize" -lt "0"] dann lass schneiden = 3 - $ {fullsize} newPWD = "... $ (echo -n $ PWD | sed -e" s / \ (^. \ {$ cut \} \) \ (. * \) / \ 2 / ")" fi} PROMPT_COMMAND = prompt_command Funktion twtty {lokal GRAY = "\ [\ 033 [1; 30m \]" local LIGHT_GRAY = "\ [ \ 033 [0; 37m \] "local WHITE =" \ [\ 033 [1; 37m \] "lokal NO_COLOUR =" \ [\ 033 [0m \ "" local LIGHT_BLUE = "\ [\ 033 [1; 34m \ ] "local GELB =" \ [\ 033 [1; 33m \] "case $ TERM in xterm *) TITLEBAR = '\ [\ 033] 0; \ u \ \ h: \ w \ 007 \]' ;; *) TITLEBAR = "" ;; esac PS1 = "$ TITLEBAR \ $ GELB- $ LICHT_BLAU - (\ $ GELB \ $ benutzername $ LICHT_BLUE @ $ GELB \ $ hostername $ LICHT_BLAU: $ WEISS \ $ kur_tty \ $ {LICHT_BLAU}) - $ {GELB} - \ $ {fill} $ {LIGHT_BLUE} - (\ $ GELB \ $ {newPWD} \ $ LIGHT_BLUE) - $ GELB- \ \ n \ $ GELB- $ LIGHT_BLUE - (\ $ GELB \ $ (Datum +% H% M) $ LIGHT_BLUE: $ GELB \ $ (Datum \ "+% a, % d% b% y \") \ $ LIGHT_BLUE: $ WHITE \ $$ LIGHT_BLUE) - \ $ GELB- \ $ NO_COLOUR "PS2 =" $ LIGHT_BLUE- $ GELB- $ GELB- $ NO_COLOUR "}
Eine wichtige Anmerkung zu dieser Eingabeaufforderung ist, dass der horizontale Balken so skaliert wird, dass er der Breite Ihres Terminals entspricht, und dass die Arbeitsverzeichniszeile sich selbst schneidet, wenn sie zu groß wird.
Wenn Sie Probleme mit dem obigen Code-Snippet haben, können Sie die Klartext-Version hier herunterladen.
High-Performance minimalistische Eingabeaufforderung
All die Komplexität einer ausgefallenen Eingabeaufforderung wie Twtty nimmt zusätzliche CPU-Zyklen in Anspruch, und obwohl es Ihr System sicher nicht zum Stillstand bringt, kann es sich summieren. Wenn Sie etwas wollen, das viele Informationen enthält, ohne Sie zu verlangsamen, schlage ich folgendes vor:
PS1 = "[\ d | \ T -> \ w ... \ $?] \ N #"
Eine interessante Sache, die hier zu beachten ist, ist die Verwendung der Variablen $? Am Ende. Dies bedeutet den Exit-Status des zuletzt eingegebenen Befehls. 0 bedeutet, dass alles in Ordnung ist, jede andere Zahl weist auf einen Fehler hin.
Robs Eingabeaufforderung
Dies ist eine der beliebtesten Ansagen im Internet. Der Code ist klein und einfach, bietet jedoch viele der Funktionen, die in den größeren, komplexeren Beispielen zu finden sind.
PS1 = "\ [\ 033 [0; 33m \] [\!] \` If [[\ $? = "0"]]; dann echo "\\ [\\ 033 [32m \\]"; sonst echo "\\ [\\ 033 [31m \\]"; fi \ `[\ u. \ H: \` wenn [[`pwd | wc -c | tr -d" "> 18]]; dann echo" \\ W "; sonst echo" \\ w "; fi \`] \ $ \ [\ 033 [0m \ ""; echo -ne "\ 033] 0;` hostname -s`: `pwd` \ 007"
MegaFancyPrompt
Der Name ist völlig verdient - diese Aufforderung ist ziemlich groß und äußerst schick. Es hat Farbe, Titelleistensteuerung, Benutzer-Awareness, Proxy-Erkennung, Bildschirmerkennung, Job-Zählung und mehr. Kurz gesagt, fast alle Funktionen, die wir in den anderen Aufforderungen, die wir erwähnt haben, gefunden haben, finden Sie hier und einige andere. Wenn Sie ALLES in Ihrer Eingabeaufforderung wollen, ist es das.
Hinweis: Nicht alle Funktionen sind zu jeder Zeit sichtbar, daher sehen Sie auf dem Screenshot möglicherweise nicht viel aus. Sie können jedoch die vollständige (dokumentierte, kommentierte) Skriptdatei hier herunterladen, um zu erfahren, wie Sie die gewünschten sichtbaren Teile erhalten.
COLOR_WHITE = '\ 033 [1; 37m' COLOR_LIGHTGRAY = '033 [0; 37m' COLOR_GRAY = '\ 033 [1; 30m' COLOR_BLACK = '\ 033 [0; 30m' FARBE_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' FARBE_BLAU = '\ 033 [0; 34m' COLOR_LIGHTBLUE = '\ 033 [1; 34m' COLOR_PURPLE = '\ 033 [0; 35m' COLOR_PINK = '\ 033 [1; 35m' FARBE_CYAN = '\ 033 [0; 36m' COLOR_LIGHTCYAN = '\ 033 [1; 36m' COLOR_DEFAULT = '\ 033 [0m' # Funktion zum Setzen von prompt_command auf. Funktion promptcmd () {history -a lokal SSH_FLAG = 0 local TTY = $ (tty | awk -F / dev / '{print $ 2}') if [[$ {TTY}]]; dann lokal SESS_SRC = $ (wer | grep "$ TTY" | awk '{print $ 6}') fi # Titelleistenfall $ {TERM} in xterm *) lokal TITLEBAR = '\ [\ 033] 0; \ u @ \ h : {\ w} \ 007 \] ';; *) local TITLEBAR = '' ;; esac PS1 = "$ {TITLEBAR}" # Test für Tageswechsel. wenn [-z $ DAY]; dann export DAY = $ (Datum +% A) sonst lokal heute = $ (Datum +% A) wenn ["$ {DAY}"! = "$ {today}"]; dann PS1 = "$ {PS1} \ n \ [$ {COLOR_GREEN} \] Tag geändert zu $ (Datum '+% A, % d% B% Y'). \ n" export DAY = $ today fi fi # Benutzer if [$ {UID} -eq 0]; dann wenn ["$ {USER}" == "$ {LOGNAME}"]; dann wenn [[$ SUDO_USER}]]; dann PS1 = "$ {PS1} \ [$ {COLOR_RED} \]" sonst PS1 = "$ {PS1} \ [$ {COLOR_LIGHTRED} \] \ u" sonst PS1 = "$ {PS1} \ [$ {COLOR_YELLOW} \] \ u "fi else wenn [$ {USER} == $ {LOGNAME}]; dann PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \] \ uu" PS1 = "$ {PS1} \ [$ {COLOR_BROWN} \] \ u" fi fi # HTTP-Proxy var konfiguriert oder nicht, wenn [- n "$ http_proxy"]; dann PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \] @" anderes PS1 = "$ {PS1} \ [$ {COLOR_LIGHTRED} \] @" fi # Host wenn [[$ {SSH_CLIENT}]] || [[$ {SSH2_CLIENT}]]; dann SSH_FLAG = 1 fi if [$ {SSH_FLAG} -eq 1]; dann PS1 = "$ {PS1} \ [$ {COLOR_CYAN} \] \ h" elif [[-n $ {SESS_SRC}]]; dann wenn ["$ {SESS_SRC}" == "(: 0.0)"]; dann PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \] \ h" anderes lokales parent_process = `cat / proc / $ {PPID} / cmdline 'wenn [[" $ parent_process "==" in.rlogind * " ]]; dann PS1 = "$ {PS1} \ [$ {COLOR_BROWN} \] \ h" elif [[$ parent_process "==" in.telnetd * "]]; dann PS1 = "$ {PS1} \ [$ {COLOR_YELLOW} \] \ h" anderes PS1 = "$ {PS1} \ [$ {COLOR_LIGHTRED} \] \ h" fi fi elif [[$ {SESS_SRC} "= = ""]]; dann PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \] \ h" sonst PS1 = "$ {PS1} \ [$ {COLOR_RED} \] \ h" fi # Freigesetzte Bildschirmsitzungen local DTCHSCRN = $ (screen - ls | grep -c Trennen) if [$ {DTCHSCRN} -gt 2]; dann PS1 = "$ {PS1} \ [$ {COLOR_RED} \] [scr: $ {DTCHSCRN}]" elif [$ {DTCHSCRN} -gt 0]; dann PS1 = "$ {PS1} \ [$ {COLOR_YELLOW} \] [scr: $ {DTCHSCRN}]" fi # Backgrounded laufende Jobs local BKGJBS = $ (jobs -r | wc -l) if [$ {BKGJBS} - gt 2]; dann PS1 = "$ {PS1} \ [$ {COLOR_RED} \] [bg: $ {BKGJBS}]" elif [$ {BKGJBS} -gt 0]; dann PS1 = "$ {PS1} \ [$ {COLOR_YELLOW} \] [bg: $ {BKGJBS}]" fi # Gestoppte Jobs local STPJBS = $ (jobs -s | wc -l) if [$ {STPJBS} -gt 2]; dann PS1 = "$ {PS1} \ [$ {FARBE_RED} \] [stp: $ {STPJBS}]" elif [$ {STPJBS} -gt 0]; dann PS1 = "$ {PS1} \ [$ {FARBE_YELLOW} \] [stp: $ {STPJBS}]" fi # Klammer {if [$ {UID} -eq 0]; dann wenn ["$ {USER}" == "$ {LOGNAME}"]; dann wenn [[$ SUDO_USER}]]; dann PS1 = "$ {PS1} \ [$ {COLOR_RED} \]" sonst PS1 = "$ {PS1} \ [$ {FARBE_LIGHTRED} \]" fi else PS1 = "$ {PS1} \ [$ {COLOR_YELLOW} \ ] "fi else if [" $ {USER} "==" $ {LOGNAME} "]; dann PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \]" sonst PS1 = "$ {PS1} \ [$ {COLOR_BROWN} \]" fi fi PS1 = "$ {PS1} {" # Arbeitsverzeichnis wenn [ -w "$ {PWD}"]; dann PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \] $ (prompt_workingdir)" sonst PS1 = "$ {PS1} \ [$ {COLOR_RED} \] $ (prompt_workingdir)" fi # Klammer schließen} und $ \ # if [$ {UID} -eq 0]; dann wenn ["$ {USER}" == "$ {LOGNAME}"]; dann wenn [[$ SUDO_USER}]]; dann PS1 = "$ {PS1} \ [$ {COLOR_RED} \]" sonst PS1 = "$ {PS1} \ [$ {FARBE_LIGHTRED} \]" fi else PS1 = "$ {PS1} \ [$ {COLOR_YELLOW} \ ] "fi else if [" $ {USER} "==" $ {LOGNAME} "]; dann PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \]" sonst PS1 = "$ {PS1} \ [$ {COLOR_BROWN} \]" fi fi PS1 = "$ {PS1}} \ $ \ [$ { COLOR_DEFAULT} \] "} # Trimm Arbeitsverzeichnis auf 1/4 der Bildschirmbreite prompt prompt_workingdir () {local pwdmaxlen = $ (($ COLUMNS / 4)) local trunc_symbol =" ... "wenn [[$ PWD == $ ZUHAUSE* ]]; dann newPWD = "~ $ {PWD # $ HOME}" sonst newPWD = $ {PWD} fi wenn [$ {# newPWD} -gt $ pwdmaxlen]; dann local pwdoffset = $ (($ {# neuPWD} - $ pwdmaxlen + 3)) newPWD = "$ {trunc_symbol} $ {neuPWD: $ pwdoffset: $ pwdmaxlen}" fi echo $ newPWD} # Bestimmen Sie, welche Eingabeaufforderung angezeigt werden soll: # 1. Zeigen Sie eine einfache benutzerdefinierte Eingabeaufforderung für Shell-Sitzungen an, die # per Skript gestartet wurden. # 2. Zeigen Sie "bland" -Prompt für Shell-Sessions in Emacs oder # xemacs an. # 3 Display promptcmd für alle anderen Fälle. Funktion load_prompt () {# PIDs abrufen local parent_process = $ (cat / proc / $ PPID / cmdline | cut -d \. -f 1) lokal my_process = $ (cat / proc / $$ / cmdline | cut -d \. -f 1) if [[$ parent_process == Skript *]]; dann PROMPT_COMMAND = "" PS1 = "\ t - \ # - \ u \ \ H {\ w} \ $" elif [[$ parent_process == emacs * || $ parent_process == xemacs *]]; dann PROMPT_COMMAND = "" PS1 = "\ u \ \ h {\ w} \ $" sonst Export DAY = $ (Datum +% A) PROMPT_COMMAND = promptcmd fi Export PS1 PROMPT_COMMAND} load_prompt
Bonus - Die richtigen Farben finden
Wie Sie vielleicht bemerkt haben, verwenden die meisten dieser Eingabeaufforderungen Farbe, und die Farbe wird oft in einer codierten Form wie '\ 033 [1; 30m' dargestellt, was ziemlich schwer zu lesen oder zu merken ist. Eine einfache Möglichkeit, alle verfügbaren Farben zu sehen und eine Vorschau zu sehen, wie sie aussehen, ist das Einfügen des folgenden Snippets in Ihren Browser:
für i in `seq 1 7; Seq 30 48; Seq 90 107 `; echo -e "\ e [$ {i} mtest \ e [0m $ i" erledigt
Welches jeden Farbcode mit seiner Nummer ausgibt.
Fazit
Es gibt natürlich unendliche Variationen, die in Ihre Eingabeaufforderung gepackt werden könnten. Fast jede Art von Textdaten kann hinzugefügt werden, und den Entwicklern von bash war es jahrzehntelang möglich, ihre Funktionalität zu erweitern. Einige Leser haben sich sogar dazu geäußert, benutzerdefinierte Python- oder Ruby-Skripts in der Eingabeaufforderung auszuführen. Was auch immer Sie tun, machen Sie es funktional, und wenn es wirklich cool ist, schreiben Sie uns einen Link in den Kommentaren!