Was sind einige informative und nützliche Shell-Eingabeaufforderungen? (Bash, csh, ksh usw.)

8

Einer meiner Lieblingstipps für das Mac OS X- Terminal besteht darin, den letzten laufenden Prozess mit dem folgenden Code in Ihrer .bashrc-Datei in den Terminaltitel einzufügen .

trap 'printf "\033]0;  `history 1 | cut -b8-`  \007"' DEBUG

Jetzt möchte ich meine Bash-Eingabeaufforderung von der Standardeinstellung an eine funktionalere anpassen. Was sind einige nützliche Beispiele für Shell-Eingabeaufforderungen?

Dave K.
quelle

Antworten:

6

Ich benutze einen einfachen Zweiliner:

[\w]\n\u@\h>

oder

[\w]\n\u@\h#

wenn root. Die Leute sehen mich an, als wäre ich verrückt nach einer zweizeiligen Eingabeaufforderung, aber ich hasse es, nur den letzten Teil des aktuellen Pfads zu sehen, und ich arbeite mit Pfaden, die zu lang sind, um das Ganze in dieselbe Zeile wie den zu setzen Eingabebereich.

Chaos
quelle
Also muss ich verrückt sein, wenn ich eine 3-Zeilen-Eingabeaufforderung verwende, lol.
Ivan
7

Ich habe ein Skript ~/bin/setprompt, das von my ausgeführt wird und Folgendes .bashrcenthält:

RESET="\[\017\]"
NORMAL="\[\033[0m\]"
RED="\[\033[31;1m\]"
YELLOW="\[\033[33;1m\]"
WHITE="\[\033[37;1m\]"
SMILEY="${WHITE}:)${NORMAL}"
FROWNY="${RED}:(${NORMAL}"
SELECT="if [ \$? = 0 ]; then echo \"${SMILEY}\"; else echo \"${FROWNY}\"; fi"

# Throw it all together 
PS1="${RESET}${YELLOW}\h${NORMAL} \`${SELECT}\` ${YELLOW}>${NORMAL} "

Dieses Skript setzt die Eingabeaufforderung auf den Hostnamen, gefolgt davon, :)ob der letzte Befehl erfolgreich war und :(ob der letzte Befehl fehlgeschlagen ist.

Eddie
quelle
4

Dies ist jedoch die beeindruckendste, die ich je gesehen habe:

PS1='\[\033[0m\]\[\033[0;31m\].:\[\033[0m\]\[\033[1;30m\][\[\033[0m\]\[\033[0;28m\]Managing \033[1;31m\]\j\[\033[0m\]\[\033[1;30m\]/\[\033[0m\]\[\033[1;31m\]$(ps ax | wc -l | tr -d '\'' '\'')\[\033[0m\]\[\033[1;30m\] \[\033[0m\]\[\033[0;28m\]jobs.\[\033[0m\]\[\033[1;30m\]] [\[\033[0m\]\[\033[0;28m\]CPU Load: \[\033[0m\]\[\033[1;31m\]$(temp=$(cat /proc/loadavg) && echo ${temp%% *}) \[\033[0m\]\[\033[0;28m\]Uptime: \[\033[0m\]\[\033[1;31m\]$(temp=$(cat /proc/uptime) && upSec=${temp%%.*} ; let secs=$((${upSec}%60)) ; let mins=$((${upSec}/60%60)) ; let hours=$((${upSec}/3600%24)) ; let days=$((${upSec}/86400)) ; if [ ${days} -ne 0 ]; then echo -n ${days}d; fi ; echo -n ${hours}h${mins}m)\[\033[0m\]\[\033[1;30m\]]\[\033[0m\]\[\033[0;31m\]:.\n\[\033[0m\]\[\033[0;31m\].:\[\033[0m\]\[\033[1;30m\][\[\033[0m\]\[\033[1;31m\]$(ls -l | grep "^-" | wc -l | tr -d " ") \[\033[0m\]\[\033[0;28m\]files using \[\033[0m\]\[\033[1;31m\]$(ls --si -s | head -1 | awk '\''{print $2}'\'')\[\033[0m\]\[\033[1;30m\]] [\[\033[0m\]\[\033[1;31m\]\u\[\033[0m\]\[\033[0;31m\]@\[\033[0m\]\[\033[1;31m\]\h \[\033[0m\]\[\033[1;34m\]\w\[\033[0m\]\[\033[1;30m\]]\[\033[0m\]\[\033[0;31m\]:.\n\[\033[0m\]\[\033[0;31m\].:\[\033[0m\]\[\033[1;30m\][\[\033[0m\]\[\033[1;31m\]\t\[\033[0m\]\[\033[1;30m\]]\[\033[0m\]\[\033[0;31m\]:. \[\033[0m\]\[\033[1;37m\]$ \[\033[0m\]'

Versuch es einmal. Es gibt gute Informationen, aber es wird tatsächlich dazu führen, dass die Belastung Ihrer Boxen zunimmt, wenn Sie an einer Eingabeaufforderung die Eingabetaste drücken!

Glen Solsberry
quelle
1
hah, sehr beeindruckend!
Dave K
Sieht gut aus, funktioniert aber nicht auf meiner Freebsd-Box :(
Eugene Yarmash
@ Eugene y: Einige dieser Pfade sind wahrscheinlich nicht auf FreeBSD-Boxen ...
Glen Solsberry
Beängstigend, aber beeindruckend!
Siliconpi
3

Ich bin ein Fan der standardmäßigen Cygwin-Bash-Eingabeaufforderung:

PS1='\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\$ '

oder ohne Farben:

PS1='\n\u@\h \n\$ '

sieht aus wie:

username@hostname
$ ls -l
Spoulson
quelle
2

Ich mag es, die Zeit in meine einzubeziehen. Gibt mir eine Art eingebauten timeBefehl:

PS1="[\t \u@\h:\w]$ "

Nachdem ich einige davon gesehen habe, möchte ich meine ein bisschen schlauer machen!

Glen Solsberry
quelle
2

Hier ist meins (scrolle nach rechts, um mehr Interessantes zu sehen):

'-------------------------------------------------------------------------------\n${debian_chroot:+($debian_chroot)}[\w]\n\u@\h\[\033[1;33m\]\[\033[0m\]($(__git_ps1 "%s")$(parse_git_dirty))$ 

Hier ist das Ergebnis:

-------------------------------------------------------------------------------
[~]
user@host()$ 

Wenn ich mich in einem Git- Repository befinde :

-------------------------------------------------------------------------------
[~/path_to_repo]
user@host(master)$ 

Ich verwende mehrere Zeilenumbrüche und das "horizontale Lineal", um das Scannen von Puffern zu vereinfachen. Daher drücken lange Pfadnamen den Cursor nicht zu weit nach rechts.

Ivan
quelle
1

In ksh:

In meinem .profile habe ich die folgende Variable festgelegt (daher wird diese Variable nur einmal pro Sitzung festgelegt, unabhängig davon, wie viele Su's ich mache:

PCH=\>

In meiner .kshrc habe ich:

if let "${SPID:-0} != $$"; then
    PCHS="$PCHS$PCH"
fi

Ich werde root mit dem folgenden Alias ​​und nicht mit "su" (kroot ist ein Root-Benutzer mit einer ksh-Shell anstelle von sh (solaris) oder bash (linux):

alias root='PCH=\# su -m kroot'
alias me="PCH=\> su -m $USER"

Ich habe auch diese beiden Funktionen definiert:

function lprompt {
  PS1=$HOST' $? $PWD '"$PCHS "
}
function sprompt {
  PS1='$?":"${PWD##*/}'"$PCHS "
}

und schließlich am Ende von .kshrc habe ich:

lprompt

All dies gibt mir standardmäßig die automatische Einstellung des Endes meiner Eingabeaufforderung, um anzugeben, ob ich root bin (und ob ich ein übergeordnetes Element habe, das root war), das aktuelle Arbeitsverzeichnis, den Hostnamen und den Exit-Status des letzten Prozesses. sprompt löscht den Hostnamen, verkleinert den Pfad nur auf den Basisnamen und entfernt Leerzeichen:

g3 0 /home/jj33 > expr 1 / 0
expr: division by zero
g3 2 /home/jj33 > expr 1 / 1
1
g3 0 /home/jj33 > root
Password: 
g3 0 /home/jj33 ># me
g3 0 /home/jj33 >#> ^D
g3 0 /home/jj33 ># sprompt
0:jj33># me
g3 0 /home/jj33 >#> sprompt
0:jj33>#>expr 1 / 0
expr: division by zero
2:jj33>#>

Die Root / Me-Aliase stammen aus der Pre-Sudo-Administration auf Solaris und alte Gewohnheiten sind schwer gestorben. Ich bezweifle, dass irgendjemand heutzutage genau dasselbe implementieren würde. Die Funktionen zum Ändern der Eingabeaufforderung und der vorhandene Status sind für mich weiterhin sehr wertvoll.

jj33
quelle
1

Ich habe eine Eingabeaufforderung, die einfach ist, aber Farben verwendet, um zusätzliche Informationen zu geben:

drewble:~$ 

Die Farbe des Hostnamens (in diesem Fall Drawble) ist auf jedem Computer unterschiedlich. Wenn ich einen neuen Computer erhalte, an dem ich arbeite, wähle ich eine beliebige Farbe für diesen Computer. Auf diese Weise kann ich bei vielen geöffneten Terminals leicht erkennen, auf welchen Computer sie SSH-fähig sind, und Fehler reduzieren, die ich mache, wenn ich auf dem falschen Computer bin. Wenn ich das tue sudo -s, setze ich außerdem den Hostnamen in Großbuchstaben und färbe den Doppelpunkt wieder rot. Dies reduziert Fehler, indem klargestellt wird, dass Sie als Root fungieren. Der Pfad ( ~in diesem Fall mein Ausgangsverzeichnis) ist hellgrün, wodurch die Ausgabezeilen getrennt werden können. Wenn etwas viel Ausgabe erzeugt, ist es einfach, nach oben zu scrollen und zu sehen, wo die Ausgabe begonnen hat.

# Color the hostname
HOSTNAME=`hostname|sed -e 's/\..*$//'`
if [ $HOSTNAME = 'Caligula' ] || [ $HOSTNAME = 'Caligula.local' ]; then
    export HOST_COLOR="\[\033[1;35m\]"
fi
if [ $HOSTNAME = 'drewble' ]; then
    export HOST_COLOR="\[\033[1;34m\]"
fi
if [ $HOSTNAME = 'davinci' ]; then
    export HOST_COLOR="\[\033[1;31m\]"
fi

# Color the colon red & capitalize hostname if root
COLON_COLOR='0m'
if [ ${UID} -eq 0 ]; then
    COLON_COLOR='1;31m'
fi
if [ ${UID} -eq 0 ]; then
    HOSTNAME="`echo $HOSTNAME|tr '[a-z]' '[A-Z]'`"
fi

# Set the actual prompt
PS1=`echo -ne "$HOST_COLOR$HOSTNAME\[\033[00m\]\[\e[$COLON_COLOR\]:\[\033[01;32m\]\w\[\033[00m\]\\[\033[01;33m\]\$\[\033[00m\] "`
Drew Stephens
quelle
1

Es ist keine Shell-Eingabeaufforderung, aber es ist eine Anpassung, die dem Geist Ihrer Anfrage entspricht.

Ich habe die folgende Umgebungsvariable festgelegt:

if [ -z "$PROMPT_COMMAND" ]; then
    export PROMPT_COMMAND='history -a'
else
    export PROMPT_COMMAND="history -a;$PROMPT_COMMAND"
fi

Auf diese Weise verliere ich nicht den Verlauf, wenn mehrere Terminals über den Bildschirm oder was auch immer geöffnet sind, wenn sie sich gegenseitig ändern.

deinspanjer
quelle
1
  export PS1="\[`if [[ $? = 0 ]]; then echo '\e[32m\h\e[0m'; else echo '\e[31m\h\e[0m' ; fi`:\w\n$ "

Dies zeigt an:

hostname:~
$ 

Mit 'Hostname' in Grün, wenn der zuletzt ausgeführte Befehlsrückgabecode '0' war, und Rot, wenn er> '0' war.

jtimberman
quelle
1

Ähnlich wie bei Chaos , mag ich es irgendwie

\u@\h:\w\n\u@\h:\$

das gibt mir

root@host-10548:/var/www/site.org
root@host-10548:$

Durch Einfügen des Benutzers / Hosts in die erste Zeile kann ich bei Verwendung von SCP oder rsync zum Senden einiger Dateien in dieses Verzeichnis problemlos die gesamte Pfadzeile kopieren .

Zoredache
quelle
Exzellente Idee. Ich kann sehen, dass der vollständige scp-Pfad sehr nützlich ist. Die zweite Zeile kann durch Hinzufügen der Zeit wie in gms8994 vorgeschlagen verbessert werden.
Dave K
0

Für Bash mag ich

PS1 = "\ h \ d \ t \ w \ n \ u>"

was in ... resultiert:

myserver Mo Sep 07 07:43:11 / u08
root>

Sie erhalten also Hostname, Datum und Uhrzeit, vollständigen Pfad und dann Benutzernamen in einer neuen Zeile mit der Eingabeaufforderung. Dies dient dazu, den Zeilenumbruch in Verzeichnissen zu minimieren. Ich bin den ganzen Tag in und aus Kisten, also kann ich nur gut tun, um es gerade zu halten. Ich habe auch Kitt eingestellt, um alles zu protokollieren. Ich kann zurückgehen und mir die Protokolle ansehen und genau sehen, was ich wann getan habe. Auch praktisch, um Ereignissequenzen in mehreren Terminalfenstern gleichzeitig herauszufinden.

Ronald Pottol
quelle
0

Meine normale Eingabeaufforderung ist

\u@\h $PWD $WINDOW [$?] \$

Dies gibt mir den aktuellen Benutzer, das aktuelle Host-Verzeichnis ( ohne $ HOME durch ~ zu ersetzen), das aktuelle screenFenster und die letzte Fehlerrückgabe. Da normalerweise 16 oder mehr Bildschirmfenster geöffnet sind, ist es hilfreich, das aktuelle zu kennen.

staticsan
quelle
0

Meine zsh-Eingabeaufforderung:

[andrew@hostname ~]%

Normalerweise ist es rot und weiß mit dem aktuellen Verzeichnis in pink. Wenn root, ist es dunkler grau mit dem Hostnamen in rot. Wenn $?nicht 0, wird das letzte% rot angezeigt.

function precmd {

   ERR=$?

   if [ $UID -eq 0 ]; then
       MYPROMPT="$(print '%{\e[1;30m%}[%{\e[0m%}')$(print '%{\e[1;31m%}%n%{\e[0m%}')@$(print '%{\e[1;31m%}%m%{\e[0m%}') $(print '%{\e[1;35m%}%3c%{\e[0m%}')$(print '%{\e[1;30m%}]%{\e[0m%}')"
   else
       MYPROMPT="[$(print '%{\e[1;31m%}%n%{\e[0m%}')@%m $(print '%{\e[1;35m%}%3c%{\e[0m%}')]"
   fi

   if [ $ERR -ne 0 ]; then
       ERROR="$(print '%{\e[1;31m%}%#%{\e[0m%}') "
       export PS1=$MYPROMPT$ERROR
   else
       export PS1="$MYPROMPT%# "
   fi

   export RPS1=""
}
theotherreceive
quelle