GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie erzeuge ich eine Ps1-Eingabeaufforderung in Bash oder Ksh93 ähnlich wie Tcsh?

In tcsh habe ich die Vorgabe:

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 die Ersetzung von $HOME von ~ ist einfach, ebenso wie das Extrahieren des Namens nur des aktuellen Verzeichnisses, aber ich muss noch einen Weg finden, den %c3 zu replizieren Verhalten von tcsh. Zur Zeit habe ich in ksh93:

[[email protected]] hello $ 

und

[[email protected]] ~ $ 

Hat jemand irgendwelche Vorschläge dazu?

Akzeptierte Antwort:

In ksh93 :

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

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

Wenn Sie möchten, dass es auch $HOME ersetzt mit ~ , etwas fieseres wird 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 in bash funktionieren , obwohl bash hat seine eigenen Prompt-Escapes (z. B. h für ${HOSTNAME%%.*} ) und Pfadverkürzungsmechanismus (mit PROMPT_DIRTRIM ).

Außerdem wird die fiesere Variante wirklich fies, weil bash , im Gegensatz zu ksh93 , wird fork() ein separater Prozess für jeden $(...; printf ...) Befehlsersetzung, auch wenn sie nur eingebaute Elemente enthält. Dies gilt auch für pdksh abgeleitete Shells, wie mksh .

zsh hat Prompt-Escapes ziemlich ähnlich, aber nicht identisch mit tcsh :

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

Hinweis:

Der $HOSTNAME Variable ist nicht standardmäßig in ksh93 gesetzt; stattdessen könnten Sie den uname verwenden builtin (nach Aktivierung mit PATH=/opt/ast/bin:$PATH; der /opt/ast/bin Pfad muss nicht existieren):

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

Im Gegensatz zum h Escape in Bash oder %m Escape in zsh oder tcsh das wird Verfolgen Sie die Änderungen des Hostnamens.


Linux
  1. So verwenden Sie Bash-Verlaufsbefehle

  2. Wie schreibe ich eine Schleife in Bash?

  3. Wie debuggt man ein Bash-Skript?

  4. Bash überschreibt die erste Zeile, Ps1 Bash Prompt?

  5. Pfadtrenner in Ps1 hervorheben?

So kommentieren Sie in Bash

So passen Sie die Bash-Eingabeaufforderung unter Linux an

So erstellen Sie Bash-Aliase

So passen Sie die Bash-Terminal-Eingabeaufforderung unter Debian 10 an

So führen Sie ein Bash-Skript aus

Wie zeige ich den aktuellen Pfad in der Eingabeaufforderung in Linux sh (nicht bash) an?