2017-05-04 4 views
0

Nehmen wir an, ich bin auf einer neuen Installation von Debian, Jessie (oder Wheezy). Als normaler Benutzer, habe ich die Eingabeaufforderung in der /etc/bash.bashrc Datei definiert bekam, außer Kraft setzen schließlich durch die in meinem /home/foobar/.bashrcDebian .bashrc: prompt PS1

Ok, cool, so muss ich etwas wie folgt aus: [email protected]:~$ Nun, ich versuche, zu verstehen, den Code unten: scheint

# If this is an xterm set the title to [email protected]:dir 
case "$TERM" in 
xterm*|rxvt*) 
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\[email protected]\h: \w\a\]$PS1" 
    ;; 
*) 
    ;; 
esac 

Wie Sie sehen können, die PS1 Variable (= die Eingabeaufforderung) wieder zu overrided (Ursache ja ich in einem xterm bin). Aber ich kann nicht bekommen, warum wir am Ende der Linie noch ein $PS1 haben!

PS1="a\[\e]0;${debian_chroot:+($debian_chroot)}\[email protected]\h: \w\a\]b$PS1 c" 

Und jetzt, ich habe die seltsame Aufforderung unter:

Um dies zu erhalten, I 3 Buchstaben abc in dieser Zeile gesetzt haben

es
[email protected]:~$ c 

So scheint dass die fast ganze Linie nicht benutzt wird, alles zwischen den Boxen.

  • Ist das eine Art bedingte Aussage?
  • Was ist eigentlich der Zweck dieser Linie?
  • Warum der Kommentar über den Titel des Xterm Windows sprechen, aber scheint nur die PS1 zu überschreiben? Ich führe dieses xterm durch PuTTY; in ubuntu, ist diese Linie ganz anders PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'
+0

Es ist einer von Debians langjährigen Fehlern, die Dateien im Benutzerhaus zu durcheinander zu bringen. Die Bedingungsanweisung ist Bashs Parametererweiterung, die hier schön erklärt wird: http://wiki.bash-hackers.org/syntax/pe – ceving

+0

Dies könnte nützlich sein, um zu verstehen, wie man die Bash-Eingabeaufforderung optimiert: http: //www.tldp .org/HOWTO/Bash-Prompt-HOWTO/ – ceving

+1

Die '$ PS1' am Ende ist da, um PS1 zu erlauben, vorher definiert zu werden und das fügt Text nur vor, anstatt es zu ersetzen. –

Antwort

2

der Teil zwischen \[\] scheint eine Escape-Sequenz zu sein, die von Terminal gehandhabt wird: ESC ] die OSC für Betriebssystemkommandos in folgendem Link gestattet xterm escape sequence

OSC Ps ; Pt ST 
     Set Text Parameters. For colors and font, if Pt is a "?", the 
     control sequence elicits a response which consists of the con- 
     trol sequence which would set the corresponding value. The 
     dtterm control sequences allow you to determine the icon name 
     and window title. 
     Ps = 0 -> Change Icon Name and Window Title to Pt. 

Es ist Xterm Fenstertitel zu ändern.

Da der Fenstertitel die aktuelle Arbeitsverzeichniseinstellung enthält, ermöglicht die Eingabeaufforderung das Aktualisieren des Titels beim Wechseln des Verzeichnisses nach dem Befehl cd.

+0

Wow, ich bin ziemlich beeindruckt, wo hast du das gefunden?!. Also diese ganze große Linie ist nur da, um die 'PS1'-Variable eine Escape-Sequenz * für * das Terminal, aber unsichtbar * in * die Eingabeaufforderung zu setzen. Das ist verrückt. Vielen Dank! –

+0

Beachten Sie, dass das '\ [... \]' - Paar falsch verwendet wird. keine Escapesequenzen der Shell (wie '\ u ',' \ h', etc) sollten enthalten sein, auch keine druckbaren Zeichen. Soweit ich das beurteilen kann, ist das * einzige * Ding, das enthalten sein sollte, die '\ e [0;' Sequenz. – chepner

+0

über den Link @ceving, http: //www.tldp.org/HOWTO/Bash-Eingabeaufforderung-HOWTO/xterm-title-bar-manipulations.html, gibt das gleiche Beispiel. Es scheint, dass '\ 'h \' Sequenzen von der Shell verarbeitet werden, bevor sie an xterm gesendet werden, ebenso wird' \ e' oder '\ 033' durch' esc' ASCII 27 oder 33 in oktal ersetzt. –