Mostra solo la directory corrente e parent nel prompt di bash


16

Sono nuovo a bash e vorrei che il mio prompt mostrasse qualcosa che in TCS era banale, ma dopo una buona ricerca su Google non riesco ancora a fare.

Vorrei che il mio prompt includesse solo le directory correnti e parent come questa:

/parent/currentdir $

In tcsh questo è ottenuto da:

set prompt = "%C2 %"

Tuttavia, finora in bash ho scoperto solo che devo analizzare pwd per ottenere lo stesso output.

Non c'è un modo più semplice, come fare:

export PS1="$(some_command) $" 

2
In teoria, PS1='\w \$'; PROMPT_DIRTRIM=2dovrebbe darti l'equivalente bash, ma questo non funziona correttamente sul mio sistema.
Mikel,

Non funziona affatto sul mio: GNU bash, versione 3.2.57 (1) -release (x86_64-apple-darwin14).
twalbaum,

PROMPT_DIRTRIMè stato introdotto in Bash 4 . Ho appena provato su Ubuntu 16.04 sotto WSL e ha funzionato benissimo!
Mike Branski l'

Risposte:


18

Le funzionalità di controllo rapido di Bash sono piuttosto statiche. Se si desidera un maggiore controllo, è possibile includere variabili nel prompt; assicurati di non aver disattivato l' promptvarsopzione .

PS1='${PWD#"${PWD%/*/*}/"} \$ '

Nota le virgolette singole: le espansioni delle variabili devono avvenire nel momento in cui viene visualizzato il prompt, non nel momento in cui PS1viene definita la variabile.

Se si desidera un maggiore controllo su ciò che viene visualizzato, è possibile utilizzare le sostituzioni di comandi. Ad esempio, lo snippet sopra perde l' ~abbreviazione della home directory.

PS1='$(case $PWD in
        $HOME) HPWD="~";;
        $HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
        $HOME/*) HPWD="~/${PWD##*/}";;
        /*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
        *) HPWD="$PWD";;
      esac; printf %s "$HPWD") \$ '

Questo codice è piuttosto ingombrante, quindi invece di inserirlo nella PS1variabile, è possibile utilizzare la PROMPT_COMMANDvariabile per eseguire il codice per impostare HPWDe quindi utilizzarlo nel prompt.

PROMPT_COMMAND='case $PWD in
        $HOME) HPWD="~";;
        $HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
        $HOME/*) HPWD="~/${PWD##*/}";;
        /*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
        *) HPWD="$PWD";;
      esac'
PS1='$HPWD \$'

Poiché il prompt abbreviato è cambiato solo in una modifica della directory, non è necessario ricalcolarlo ogni volta che viene visualizzato un prompt. Bash non fornisce un hook che gira su un cambio di directory corrente, ma puoi simularlo eseguendo l'override cde i suoi cugini.

cd () { builtin cd "$@" && chpwd; }
pushd () { builtin pushd "$@" && chpwd; }
popd () { builtin popd "$@" && chpwd; }
chpwd () {
  case $PWD in
    $HOME) HPWD="~";;
    $HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
    $HOME/*) HPWD="~/${PWD##*/}";;
    /*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
    *) HPWD="$PWD";;
  esac
}
PS1='$HPWD \$'

Si noti che non è necessario e non è necessario esportare PS1, poiché si tratta di un'impostazione della shell, non di una variabile di ambiente. Un'impostazione bash PS1non sarebbe stata compresa da altre shell.

PS Se vuoi una piacevole esperienza interattiva della shell, passa a zsh , dove tutte queste (estensioni rapide che %comprendono in gran parte tcsh chpwd, ecc.) Sono funzionalità native.

PS1='%2~ %# '

2
Questa avrebbe dovuto essere la risposta accettata e più votata.
LarsH,

3

La sintassi per ottenere le directory principali e correnti è presa dalla risposta di Munai .

Tuttavia, come notato da Gilles, quel codice mostra solo la directory corrente al momento del .bashrccaricamento, ma non cambierà mentre navighi nel sistema verso altre cartelle.

Avere questo nel tuo .bashrcfile rende il prompt aggiornato automaticamente alla tua directory corrente:

prompt_command () {
    PS1='$(basename $(dirname "$PWD"))/$(basename "$PWD") $ '
}
PROMPT_COMMAND=prompt_command

1
Defining prompt_command()dovrebbe fare qualcosa, da solo? Non per me Intendevi usare anche prompt_command()nelle ridefinizioni di cd& co, come ha fatto Gilles? O intendevi PROMPT_COMMAND='...'?
LarsH,

2
Inoltre, questo comando ha esito negativo quando $PWDcontiene uno spazio.
LarsH,

1
Grazie per avermi riportato a questo. Citato $ PWD per consentire spazi e includeva il comando finale. Il mio attuale prompt è più complesso di questo, quindi la necessità della definizione prompt_command. Altrimenti, PS1 = ... funziona alla sua accensione.
twalbaum,

Qualche idea per ripulire l'output durante la navigazione /? Come scritto, ottieni/// $
ezrock il

0

La stringa di prompt può essere facilmente modificata bashmodificando la variabile shell PS1. Sta per Prompt String 1. Maggiori informazioni qui .

Per ora accendi il tuo bashguscio.

vi ~/.bashrc

Aggiungi la definizione PS1 nel file

`export PS1="$(basename $(dirname $PWD))/$(basename $PWD)"`

Altri tutorial qui e qui , per aiutarti a modificarlo ancora di più.


1
Capisco come modificare il prompt. La mia domanda è come ottenere solo le directory correnti e parent, non l'intero percorso.
twalbaum,

@twalbaum ha modificato la mia risposta
Munai Das Udasin il

felice di aiutare @twalbaum :)
Munai Das Udasin il

1
Questo imposta il prompt sulla directory corrente al momento del .bashrccaricamento, il prompt non cambierà se ci si trova cdin un'altra directory! @twalbaum
Gilles 'SO- smetti di essere malvagio' il

@Gilles lo fa per me.
twalbaum,

0

Potrebbe essere più semplice con "~" per la directory Home.

function PWDN {
  echo "${PWD/#$HOME/~}" | rev | cut -d "/" -f1 -f2 | rev
}

0
export PS1='[\u@\h $(basename $(dirname ${PWD}))/$(basename ${PWD})]\$ '
export PROMPT_COMMAND='echo -ne "\033]0;$(basename $(dirname $PWD))/$(basename ${PWD})\007"'

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.