GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo producir un indicador de Ps1 en Bash o Ksh93 similar a Tcsh?

En tcsh, tengo el valor predeterminado:

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

que da avisos como:

[woehler:hacking/c/hello] ajcarr% 

y

[woehler:~] ajcarr% 

En otras palabras, el directorio actual y hasta los dos siguientes en la ruta.

En ksh93 o bash, la sustitución de $HOME por ~ es fácil, al igual que extraer el nombre del directorio actual, pero todavía tengo que encontrar una forma de replicar el %c3 comportamiento de tcsh. Actualmente en ksh93 tengo:

[[email protected]] hello $ 

y

[[email protected]] ~ $ 

¿Alguien tiene alguna sugerencia sobre cómo hacer esto?

Respuesta aceptada:

En ksh93 :

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

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

Si desea que también reemplace $HOME con ~ , se necesita algo más desagradable:

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

Todo esto también debería funcionar en bash , aunque bash tiene sus propios escapes rápidos (p. ej., h para ${HOSTNAME%%.*} ) y mecanismo de acortamiento de ruta (con PROMPT_DIRTRIM ).

Además, la variante más desagradable será realmente desagradable, porque bash , a diferencia de ksh93 , fork() un proceso separado para cada $(...; printf ...) sustitución de comandos, incluso si solo contiene funciones integradas. Esto también es válido para pdksh shells derivados, como mksh .

zsh tiene escapes rápidos bastante similares pero no idénticos a tcsh :

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

Nota:

El $HOSTNAME la variable no está establecida de forma predeterminada en ksh93; en lugar de eso, podría usar uname incorporado (después de habilitarlo con PATH=/opt/ast/bin:$PATH; el /opt/ast/bin la ruta no necesita existir):

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

A diferencia de la h escapar en bash o %m escapar en zsh o tcsh esto será realizar un seguimiento de los cambios de nombre de host.


Linux
  1. Cómo usar los comandos del historial de Bash

  2. Prepara tu indicador de Bash para el invierno en Linux

  3. Cómo personalizar los colores y el contenido de Bash en el indicador de terminal de Linux

  4. ¿Cómo depurar un script Bash?

  5. Bash sobrescribe la primera línea, Ps1 Bash Prompt?

Cómo comentar en Bash

Cómo personalizar Bash Prompt en Linux

Cómo crear alias de Bash

Cómo personalizar el indicador de Bash Terminal en Debian 10

Cómo ejecutar un script Bash

¿Cómo mostrar la ruta actual en el símbolo del sistema en sh (no bash) de Linux?