GNU/Linux >> Linux Esercitazione >  >> Linux

Come produrre un prompt Ps1 in Bash o Ksh93 simile a Tcsh?

In tcsh, ho l'impostazione predefinita:

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

che fornisce prompt come:

[woehler:hacking/c/hello] ajcarr% 

e

[woehler:~] ajcarr% 

In altre parole, la directory corrente e fino alle due successive sopra di essa nel percorso.

In ksh93 o bash, la sostituzione di $HOME per ~ è facile, così come estrarre il nome della sola directory corrente, ma devo ancora trovare un modo per replicare %c3 comportamento di tcsh. Al momento in ksh93 ho:

[[email protected]] hello $ 

e

[[email protected]] ~ $ 

Qualcuno ha qualche suggerimento su come farlo?

Risposta accettata:

In ksh93 :

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

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

Se vuoi che sostituisca anche $HOME con ~ , è necessario qualcosa di più cattivo:

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% _

Tutto questo dovrebbe funzionare anche in bash , sebbene bash ha i propri messaggi di escape (es. h per ${HOSTNAME%%.*} ) e il meccanismo di accorciamento del percorso (con PROMPT_DIRTRIM ).

Inoltre, la variante più cattiva sarà davvero cattiva, perché bash , a differenza di ksh93 , fork() un processo separato per ogni $(...; printf ...) sostituzione del comando, anche se contiene solo built-in. Questo vale anche per pdksh shell derivate, come mksh .

zsh ha prompt escape abbastanza simili ma non identici a tcsh :

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

Nota:

Il $HOSTNAME la variabile non è impostata per impostazione predefinita in ksh93; al suo posto potresti usare uname builtin (dopo averlo abilitato con PATH=/opt/ast/bin:$PATH; il /opt/ast/bin il percorso non deve necessariamente esistere):

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

A differenza di h escape in bash o %m escape in zsh o tcsh questo sarà tenere traccia delle modifiche al nome host.


Linux
  1. Come abbreviare il prompt di Bash in Linux?

  2. Come aggiungere un'icona al prompt di bash

  3. Come produrre suoni in C su Linux?

  4. Spingendo il mio prompt PS1 su ssh

  5. Come visualizzare il percorso corrente nel prompt dei comandi in sh di Linux (non bash)?

Come commentare in Bash

Come personalizzare il prompt di Bash in Linux

Come creare alias Bash

Come personalizzare il prompt di Bash Terminal su Debian 10

Come eseguire uno script Bash

Come impostare il colore del prompt dei comandi in Bash?