Novas linhas finais são removidas das substituições de comandos. Mesmo o zsh não oferece uma opção para evitar isso. Então, se você quiser preservar as novas linhas finais, você precisa providenciar para que elas não sejam novas linhas finais.
A maneira mais fácil de fazer isso é imprimir um caractere extra (diferente de uma nova linha) após os dados que você deseja obter exatamente e remover esse caractere extra final do resultado da substituição do comando. Opcionalmente, você pode colocar uma nova linha depois desse caractere extra, que será removido de qualquer maneira.
No zsh, você pode combinar a substituição de comandos com a manipulação de strings para remover o caractere extra.
my_info='${$(my_info; echo .)%.}'
PROMPT="${my_info}My awesome prompt $>"
Em seu cenário, tome cuidado para que my_info
não seja a saída do comando, é um fragmento de shell para obter a saída, que será avaliada quando o prompt for expandido. PROMPT=${my_info%x}…
não funcionou porque tenta remover um x
final do valor da variável my_info
, mas termina com )
.
Em outros shells, isso precisa ser feito em duas etapas:
output=$(my_info; echo .)
output=${output%.}
No bash, você não seria capaz de chamar my_info
diretamente de PS1
; em vez disso, você precisaria chamá-lo de PROMPT_COMMAND
.
PROMPT_COMMAND='my_info=$(my_info; echo .)'
PS1='${my_info%.}…'