Senden von speziellen Bash-Zeichen an eine benutzerdefinierte Funktion

452
David Kennedy

Ich habe diesen großartigen Artikel zum Anpassen der Bash-Eingabeaufforderung gelesen:

http://blog.superuser.com/2011/09/21/customizing-your-bash-command-prompt/

Ich habe auch über die Verwendung von 256 Farben in Bash gelesen:

http://www.logilab.org/blogentry/20255

Nun, so sieht mein .bashrc aus:

# Extended 256 colors ext-color() { echo -ne "\[\033[38;5;$1m\]$2\[\033[m\]" }  # Set a fancy prompt PS1="`ext-color 172 \u` in `ext-color 172 $(pwd)`" 

Das kommt mir schon ziemlich nahe, eine orangefarbene Aufforderung zu haben, aber der Benutzername wird nicht gedruckt. Stattdessen sieht es so aus:

u in /home/dave 

Wie ändere ich dies, um den Benutzernamen des aktuell angemeldeten Benutzers zu drucken? Ich meine so:

dave in /home/dave 
0

2 Antworten auf die Frage

2
Gordon Davisson

It's much simpler than you're making it out to be. When you run the command ext-color 172 \u (either as part of setting PS1 or on its own), the shell parses \u, removing what it thinks is an irrelevant \, before passing it to ext-color as $2. The solution is simple: enclose it in quotes before passing it to ext-color:

PS1="$(ext-color 172 '\u') in $(ext-color 172 '\w')" 

(Note that I've also replaced the backquotes with $( ), used \w instead of $(PWD), and quoted '\w' for the same reason as '\u'.)

Die akzeptierte Antwort wurde geändert, da dies auf das eingeht, was ich eigentlich gefragt habe. Vielen Dank. David Kennedy vor 11 Jahren 0
1
Daniel Andersson

Adapting the approach that seems to work in the second part of the prompt, try e.g.:

PS1="`ext-color 172 $(whoami)` in `ext-color 172 $(pwd)`" 

or even simpler:

PS1="`ext-color 172 $USER` in `ext-color 172 $(pwd)`" 

or even nicer:

PS1="$(ext-color 172 "$USER") in $(ext-color 172 "$(pwd)")" 

The last version won't cut off the part after a potential space in current directory because of the quotes around the pwd call.


EDIT: That won't update the working directory, as noted in the comment. I didn't even think of that since the question specifically asked about the user part (it's late here :-) ).

The easiest ("correct", "only") way is to just write

PS1='\[\033[38;5;172m\]\u\[\033[m\] in \[\033[38;5;172m\]\w\[\033[m\]' 

and skip the function definition altogether.


Expansion: To get the PS1 variable to dynamically expand function calls, use a backslash to hinder premature evaluation:

PS1="$(ext-color 172 "\$USER") in $(ext-color 172 "\$PWD")" 

should work.

Die ersten beiden scheinen zu funktionieren. Allerdings ändert sich "$ PWD" nicht, wenn ich cd. David Kennedy vor 11 Jahren 0
@ davidkennedy85: Okay, ich hatte den Verdacht, dass dies der Fall sein könnte, aber ich war mir nicht sicher. Ich werde es aktualisieren. EDIT: oder meinst du auf alle Varianten? Hmm, ja, ich kann verstehen warum. Ich frage mich, wie wir das "\ w" an das externe Gespräch weiterleiten können ... Ich habe mir das nicht mal angesehen, da Ihre Frage speziell den "\ u" - Teil betraf :-) Daniel Andersson vor 11 Jahren 0
Bei einem ungeraden Aufruf von "pwd" über die Befehlszeile oder sogar "echo $ PWD" wird "/ home / dave / Code" angezeigt, die Eingabeaufforderung ändert sich jedoch nicht. David Kennedy vor 11 Jahren 0
@ davidkennedy85: Der `pwd`-Aufruf in der` PS1`-Variablen wird nur einmal ausgeführt, wenn die `.bashrc'-Datei gelesen wird. Daher wird sie nicht ständig aktualisiert. Die "\ w" -Sequenz soll dies als "magischen Wert" berücksichtigen, der von der internen Bash-Logik interpretiert wird. Daniel Andersson vor 11 Jahren 0
Diese Abbildungen. Ich habe nur versucht, schick zu sein. Wollen Sie damit sagen, dass es unmöglich ist, spezielle Bash-Zeichen an eine benutzerdefinierte Funktion zu senden? David Kennedy vor 11 Jahren 0
Warten Sie ... es scheint, als würde "PS1 = $ (pwd)" von der Befehlszeile aus ausgegeben, aber nicht in .bashrc eingefügt werden. David Kennedy vor 11 Jahren 0
@ davidkennedy85: Nun, in diesem Fall ist die '\ w'-Sequenz nur etwas Besonderes, da Bash sie besonders interpretiert, wenn sie den `PS1'-Wert an die Eingabeaufforderung schreibt. Die Funktionsaufrufe `$ ()` oder `\` \ `` werden ausgeführt, wenn die `.bashrc`-Datei zuerst ausgeführt wird und dann nie wieder: Wenn Sie einen Backslash voranstellen, wie z. B.` \ $ (pwd) `, dann funktioniert, da es nur ausgeführt wird, wenn "PS1" aufgerufen wird. Daniel Andersson vor 11 Jahren 0
Aha! `PS1 =" $ (ext-color 172 "$ USER") in $ (ext-color 172 "\ $ PWD") "` Guter Aufruf auf dem Backslash :) David Kennedy vor 11 Jahren 0