Mostra apenas o diretório atual e o pai no prompt do bash

13

Eu sou novo no bash e gostaria que meu prompt mostrasse algo que no tcsh era trivial, mas depois de uma boa pesquisa no google eu ainda não consigo fazer.

Gostaria que meu prompt incluísse apenas os diretórios atual e pai, como este:

/parent/currentdir $

No tcsh isso é alcançado por:

set prompt = "%C2 %"

No entanto, no bash até agora eu só encontrei que tenho que analisar pwd para obter o mesmo resultado.

Não existe uma maneira mais simples, como fazer:

export PS1="$(some_command) $" 
    
por twalbaum 18.07.2015 / 22:11

5 respostas

15

Os recursos de controle de prompt do Bash são bastante estáticos. Se você quiser mais controle, você pode incluir variáveis no seu prompt; Verifique se você não desativou a promptvars opção .

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

Observe as aspas simples: as expansões de variáveis devem acontecer no momento em que o prompt é exibido, não no momento em que a variável PS1 é definida.

Se você quiser mais controle sobre o que é exibido, você pode usar substituições de comando. Por exemplo, o snippet acima perde a abreviação ~ para o diretório inicial.

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

Este código é um pouco complicado, então, em vez de colocá-lo na variável PS1 , você pode usar o PROMPT_COMMAND variable para executar o código para definir HPWD e, em seguida, usar isso no seu prompt.

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

Como o prompt abreviado só é alterado em uma alteração de diretório, não é necessário recalculá-lo toda vez que um prompt é exibido. O Bash não fornece um gancho que é executado em uma alteração de diretório atual, mas você pode simule sobrescrevendo cd e seus primos.

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 \$'

Note que você não precisa e não deve exportar PS1 , já que é uma configuração de shell, não uma variável de ambiente. Uma configuração bash PS1 não seria entendida por outras camadas.

P.S. Se você quiser uma experiência de shell interativa agradável, mude para zsh , onde todos esses (prompt % expansions amplamente englobando tcsh's, chpwd , etc.) são recursos nativos.

PS1='%2~ %# '
    
por 20.07.2015 / 01:28
2

A sintaxe para obter os diretórios pai e atual é obtida da resposta da Munai.

No entanto, como notado por Gilles, esse código mostra apenas o diretório atual no momento em que .bashrc é carregado, mas não mudará à medida que você navega no sistema para outras pastas.

Ter isso em seu arquivo .bashrc faz com que o prompt seja atualizado automaticamente para seu diretório atual:

prompt_command () {
    PS1='$(basename $(dirname "$PWD"))/$(basename "$PWD") $ '
}
PROMPT_COMMAND=prompt_command
    
por 20.07.2015 / 00:01
0

A sequência de prompts pode ser facilmente alterada em bash editando a variável de shell PS1 . Significa Prompt String 1. Mais informações aqui .

Por enquanto, abra seu bash shell.

vi ~/.bashrc

Anexe a definição PS1 no arquivo

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

Mais tutoriais aqui e

    
por 18.07.2015 / 22:44
0

Pode ser mais simples com "~" para o diretório inicial.

function PWDN {
  echo "${PWD/#$HOME/~}" | rev | cut -d "/" -f1 -f2 | rev
}
    
por 20.04.2017 / 02:27
0
export PS1='[\u@\h $(basename $(dirname ${PWD}))/$(basename ${PWD})]\$ '
export PROMPT_COMMAND='echo -ne "3]0;$(basename $(dirname $PWD))/$(basename ${PWD})
export PS1='[\u@\h $(basename $(dirname ${PWD}))/$(basename ${PWD})]\$ '
export PROMPT_COMMAND='echo -ne "3]0;$(basename $(dirname $PWD))/$(basename ${PWD})%pre%7"'
7"'
    
por 14.07.2017 / 08:44