Eu quero citar o diretório atual no meu prompt.
Por exemplo, se eu fizer:
mkdir $'new\nline'; cd $'new\nline'
Eu quero que meu prompt seja exibido $'new\nline'
e NÃO imprima uma nova linha literal.
Estou vendo um comportamento interessante tentando imprimir barras invertidas ( \
) em bash 5.0.9
:
p='\\n' && echo -E "${p@P}" # 2 slashes; output = '\n'
p='\\\\n' && echo -E "${p@P}" # 4 slashes; output = '\n'
p='\\\\\\n' && echo -E "${p@P}" # 6 slashes; output = '\\n'
p='\\\\\\\\n' && echo -E "${p@P}" # 8 slashes; output = '\\n'
Por que a saída é equivalente com (2 e 4) e (6 e 8) barras?
Dada essa confusão, e:
mkdir '\\n' && cd '\\n'
Eu não consegui descobrir como transformar programaticamente \\n
em uma string de forma que ela fosse exibida em um prompt como: \\\\n
ou $'\\\\n'
, além de lidar com o caso de nova linha literal.
Como faço para obter nomes de diretórios citados no prompt de forma que:
~
é exibido para$HOME
e uma entrelinha~/
para subdiretórios- Outros caminhos são escapados somente se necessário
- Uma cópia e colagem da string exibida é um token de shell válido referente ao diretório atual
Por exemplo "$HOME/dir with spaces"
, deve ser exibido como:
~/dir\ with\ spaces
~/$'dir with spaces'
~/'dir with spaces'
Se eu incluir
\w
no prompt ecd $'/tmp/new\nline'
, o Bash será exibido apenas/tmp/newline
no prompt. Não parece imprimir a nova linha literal, mas também não é um formato de saída inequívoco.${var@P}
destina-se a expandir escapes no estilo de prompt, como\u
nome de usuário, nome\h
de host e\w
diretório de trabalho, duvido que você queira isso aqui. Em vez disso${var@Q}
, qual cita a saída pode ser mais útil?Setting
PS1='${PWD@Q}\$ '
, recebo o prompt:$'/tmp/new\nline'$
, ou'/tmp'$
se o caminho for melhor. Uma alternativa pode serPS1='$(printf "%q" "$PWD")\$ '
, que fornece uma cotação diferente em alguns casos e, por exemplo, deixa as aspas de fora no caso de um caminho "legal", então/tmp$
.Para obter o diretório inicial mostrado como um til, uma opção seria fazer essa substituição manualmente:
Ele ainda cita todo o caminho se uma parte dele precisar ser citada, no entanto. Para contornar isso, suponho que você teria que percorrer o caminho peça por peça.
Eu não tenho idéia por que
${var@P}
colapsa as barras invertidas assim, no entanto.Com base na resposta de ilkkachu, cheguei a:
Isso tem o diretório citado como texto literal em
$PS1
vez de inclusão por meio de uma variável.A vantagem de fazer isso dessa maneira é que eu posso continuar a colorir as barras no diretório que meus olhos acham mais fácil de analisar.