So erstellen Sie eine PS1-Eingabeaufforderung in bash oder ksh93 ähnlich wie tcsh

7

In tcsh habe ich die Standardeinstellung:

prompt  [%m:%c3] %n%# 

das gibt Eingabeaufforderungen wie:

[woehler:hacking/c/hello] ajcarr% 

und

[woehler:~] ajcarr% 

Mit anderen Worten, das aktuelle Verzeichnis und bis zu den nächsten beiden darüber im Pfad.

In ksh93 oder bash ist das Ersetzen von $HOMEby ~einfach, ebenso wie das Extrahieren des Namens nur des aktuellen Verzeichnisses, aber ich habe noch keinen Weg gefunden, das %c3Verhalten von tcsh zu replizieren . Zur Zeit in ksh93 habe ich:

[ajcarr@Woehler] hello $ 

und

[ajcarr@Woehler] ~ $ 

Hat jemand Vorschläge dazu?

Alun Carr
quelle

Antworten:

8

In ksh93:

PS1='${PWD#${PWD%?/*/*/*}?/} \$ '
share/doc/libnl-3-dev $ _

PS1='[${HOSTNAME%%.*}:${PWD#${PWD%?/*/*/*}?/}] $USER% '
[host:share/doc/libnl-3-dev] user% _

Wenn Sie es wollen , auch zu ersetzen , $HOMEmit ~, ist etwas fieser benötigt:

PS1='$(d=${PWD/#$HOME/"~"};printf %s "${d#${d%?/*/*/*}?/}") $ '
~/w/maemo $ cd sb2-pathmaps
w/maemo/sb2-pathmaps $ _

PS1='$(d=${PWD/#$HOME/"~"};printf %s "[${HOSTNAME%%.*}:${d#${d%?/*/*/*}?/}]") $USER% '
[host:w/maemo/sb2-pathmaps] user% _

All dies sollte auch funktionieren bash, bashhat jedoch seine eigenen Eingabeaufforderungen (z. B. \hfür ${HOSTNAME%%.*}) und einen Pfadverkürzungsmechanismus (mit PROMPT_DIRTRIM).

Außerdem wird die schlimmere Variante wirklich böse sein, weil bash, im Gegensatz zu ksh93, wird fork()ein separater Prozess für jeden $(...; printf ...)Befehl Substitution, auch wenn es nur builtins enthält. Dies gilt auch für pdkshabgeleitete Muscheln wie mksh.


zshhat prompt Escape ganz ähnlich, aber nicht identisch mit tcsh:

zsh$ PS1='[%m:%3c] %n%# '
[host:share/doc/libnl-3-dev] user% _

Hinweis:

Die $HOSTNAMEVariable ist nicht standardmäßig in festgelegt ksh93. stattdessen können Sie das unameeingebaute verwenden (nachdem Sie es mit aktiviert haben PATH=/opt/ast/bin:$PATH; der /opt/ast/binPfad muss nicht existieren):

PS1='$(d=${PWD/#$HOME/"~"};h=$(uname -n); printf %s "[${h%%.*}:${d#${d%?/*/*/*}?/}]") $USER% '

Anders als bei der \hFlucht in bash oder %mFlucht in zshoder tcshdies wird die Hostnamen Änderungen verfolgen.

Mosvy
quelle
6

Für Bash können Sie ähnliche Ergebnisse erzielen, indem Sie die PROMPT_DIRTRIMVariable festlegen :

$ PS1='[\u@\h] \w\$ '
[schaller@r2d2] ~$ pwd
/home/schaller
[schaller@r2d2] ~$ PROMPT_DIRTRIM=3
[schaller@r2d2] ~$ cd /home/schaller/tmp/513924/another/directory/here
[schaller@r2d2] ~/.../another/directory/here$
Jeff Schaller
quelle