Farbige Eingabeaufforderung in KornShell

11

Laut diesem StackOverflow-Beitrag ist es möglich, eine farbige Eingabeaufforderung in KornShell zu haben. Ich konnte nicht herausfinden, wie das geht. Ich kann Farbe verwenden:

echo -e "\033[34mLinux\033[00m"

gibt eine blaue "Linux" -Ausgabe aus, ebenso wie:

printf "\033[34mLinux\033[00m"

Wenn ich jedoch die Escape-Codes in meine PS1Eingabeaufforderungsvariable einbinde, werden sie nicht maskiert. Was muss ich tun, um eine farbige Eingabeaufforderung zu erhalten? Ich bin nicht nur ein Trottel für Eyecandy, sondern finde auch, dass eine farbige Eingabeaufforderung nützlich ist, wenn die Ausgabe visuell analysiert wird.

Kazark
quelle

Antworten:

10

Verwenden Sie einfach ein wörtliches Esc-Zeichen, das mit Ctrl- , eingegeben vwird Esc(wird wie ^[auf dem Bildschirm angezeigt):

PS1="^[[34mLinux^[[00m"

Oder verwenden Sie die Ausgabe des echoBefehls, von dem Sie herausfinden, dass er funktioniert:

PS1="$(echo -e "\033[35mLinux\033[00m")"
Mann bei der Arbeit
quelle
Manchmal merke ich, dass ich noch ein Kommandozeilen-Noob bin. Normalerweise fühle ich mich im Vergleich zu meinen Freunden so gut. :) Die erste Version hat gut funktioniert; Was für ein toller Trick! Ich hatte keinen Erfolg mit der zweiten Version. +1
Kazark
5

Sie müssen ein wörtliches Escapezeichen in die PS1Variable einfügen. Ksh88 und Klone wie pdksh und mksh (ältere Versionen) haben keine wörtliche Syntax für Steuerzeichen, außer über die printintegrierte. Mksh versteht \efür Flucht, aber pdksh benötigt den Oktalcode \033.

PS1=$(print '\033[34mLinux\033[00m')

ATT ksh93 führt die Backlash- $'…'Escape -Literal-Syntax ein (seit R39b auch in mksh verfügbar). Sie können Backslash-Escapezeichen verwenden, um Steuerzeichen in diese Literale einzufügen.

PS1=$'\e[34mLinux\e[00m'
Gilles 'SO - hör auf böse zu sein'
quelle
2
Eigentlich mkshunterstützt auch $'…'- zugegebenermaßen, weil Dave Korn (der Korn in Korn Shell) darauf bestand, dass ich es hinzufüge.
Mirabilos
@mirabilos Ah, danke. Ich habe diese Antwort wahrscheinlich auf einem Computer mit mksh R39 eingegeben und neuere Versionen nicht überprüft.
Gilles 'SO - hör auf böse zu sein'
2

Ich benutze diese in mkshfür einen Benutzer shell:

# custom prompt see http://comments.gmane.org/gmane.os.miros.mksh/126
PS1=$'\a\r\a\e[1;34m\a ^ ^  ^ ^ | \a\e[36m\a${USER:=$(ulimit -c 0; id -un 2>/dev/null || echo
\?)}@${HOSTNAME%%.*}\a\e[34m\a | ^ ^  ^ ^ | \a\e[0;33m\a$(local d=${PWD:-?} p=~; [[ $p = ?(*/) ]] || d=${d/#$p/~};
print -nr -- "$d")\a\e[1;34m\a |\n ^ ^  ^ ^ | \a\e[32m\a$(date +%H:%M)\a\e[34m\a | ^ ^ >>\a\e[0m\a '

& etwas anders shellfür root:

PS1=$'\a\r\a\e[1;34m\a ^ ^  ^ ^  ^   \a\e[31m\a${USER:=$(ulimit -c 0; \
    id -un 2>/dev/null || echo \?)}@${HOSTNAME%%.*}\a\e[34m\a  ^ ^  ^ ^  ^ ^  ^   \a\e[0;33m\a$(
        local d=${PWD:-?} p=~
        [[ $p = ?(*/) ]] || d=${d/#$p/~}
        print -nr -- "$d"
)\a\e[1;34m\a  ^ ^ \n ^ ^  ^ ^  ^   \a\e[32m\a$(date +%H:%M)\a\e[34m\a  ^ ^  ^ ^   \a\e[0m\a '

Geben Sie hier die Bildbeschreibung ein

Da die Sonderzeichen nicht kopiert wurden, finden Sie hier eine Pastebin-Paste für den normalen Benutzer und root.

Stuart Cardall
quelle
1

In den Antworten der Menschen gehen verschiedene Dinge vor sich, die jeweils eine andere Syntax beinhalten.

  1. Die Escape-Sequenzen für Ihr Terminalprogramm finden Sie in der Dokumentation.

  2. So codieren Sie die Terminal-Escape-Sequenzen in der PS1-Variablen, z. B. \ e oder Literal-Escape. Dies hängt von der Shell ab.

  3. Hinzufügen von Änderungsinformationen zur Eingabeaufforderung, z. B. Hostname, aktuelles Verzeichnis usw. Dies hängt auch von der Shell ab. Möglicherweise können Sie spezielle Backslash-Sequenzen wie \ w für das Arbeitsverzeichnis verwenden, oder Sie müssen möglicherweise Umgebungsvariablen benennen oder Befehlszeilen in die Zeichenfolge einbetten.

  4. Wie man der Shell sagt, welche Zeichen gedruckt werden und welche nicht. Die Shell weiß nicht, wo Ihre Terminal-Escape-Sequenzen beginnen und enden. Wenn die Shell über einen Befehlszeileneditor oder ähnliches verfügt, muss sie wissen, welche Zeichen gedruckt werden, damit sie weiß, wo sich der Cursor befindet. Ohne dieses Detail sieht Ihre Eingabeaufforderung möglicherweise richtig aus, aber die Bearbeitung kann sich seltsam verhalten.

    • In bash setzen Sie \ [vor jeder Escape-Sequenz und \] danach.

    • In ksh wählen Sie ein einzelnes nicht druckbares ASCII-Zeichen aus, das an keiner anderen Stelle in der Zeichenfolge vorkommen kann. Am Anfang der Zeichenfolge schreiben Sie dieses Zeichen, gefolgt von einem ASCII-Wagenrücklauf. Dann schreiben Sie vor und nach jeder Escape-Sequenz das gleiche Zeichen. z3ntu wählte \ a als Markierungszeichen.

Derek Peschel
quelle
0

Dank früherer Antworten und anderer Quellen konnte ich Folgendes finden:

Korn Shell Eingabeaufforderung:

PS1="$(echo "\033[32m`logname`\033[35m@\033[32m`hostname` \033[33m`pwd`\033[36m\n\$\033[0m")"

Bash-Eingabeaufforderung:

PS1="\[\e[32m\]\u\[\e[35m\]@\[\e[32m\]\h \[\e[33m\]\w\[\e[36m\]\n\$\[\e[0m\]"

Diese geben die gleiche farbige Eingabeaufforderung (ja, ich spreche Englisch der Königin;)) im Format:

username@computername /current/working/directory
$

Das DOS-Äquivalent (obwohl es keine Farboptionen gibt) lautet:

prompt %username%@%computername% $P$_$G

was gibt:

username@computername /current/working/directory
>

Das ">" hält es mit "$" eher "DOSsy" als "nixy", aber wenn Sie stattdessen das Siegel ("$") möchten, dann wäre es:

prompt %username%@%computername% $P$_$$

Vorausgesetzt, Ihr Anmeldekonto verfügt über die erforderlichen Berechtigungen, damit die 'Nixies' ihnen permanent "Export" voranstellen:

export PS1="..."

und ändern Sie die DOSsy in:

setx PROMPT "%username%@%computername% $P$_$G"

oder

setx PROMPT "%username%@%computername% $P$_$$"
Skeetastax
quelle