Aqui estão algumas abordagens (bem, 2½):
-
Se você tem interesse em poder para modificar incrementalmente as configurações de
PS1que seguem um modelo geral,- Crie um arquivo que contenha apenas a linha
PS1=…. - Escreva os comandos
sedpara editá-lo, peça por peça; por exemplo.,-
sed -e 's/${debian_chroot:+($debian_chroot)}/\d \t /' -
sed -e 's/\033/\e/g' - etc.
-
- Você pode achar mais fácil depurar esses comandos menores e mais simples.
Quando você tiver todos eles trabalhando,
deve ser fácil costurá-los juntos.
-
Você observou o valor de
$original? Por exemplo, você já fezprintf "%s\n" "$original"
? Lembre-se, quando você diz algo como"The quick brown fox 'jumps over' the lazy dog."A string inteira está em duplo citações. Então quando você diz
"Humpty '$var' Dumpty"O
$varé expandido porque está entre aspas duplas.Agora olhe para sua string
original:original="PS1='${debian_chroot:+($debian_chroot)}\[3[01;31m\]\u@\h\[3[00m\]:…"O
${debian_chroot:+($debian_chroot)}é expandido quando você faz essa tarefa. Então isso é um problema.
- Crie um arquivo que contenha apenas a linha
-
Se você quiser apenas alterar
PS1para seu novo valor, independentemente do que já está lá, não tente esculpir a estátua da raposa e então adicione argila na esperança de criar uma estátua de um cachorro; basta apagar a atribuição existente e substituí-la, usando o comandosedc( c hange), que substitui um grupo de uma ou mais linhas com outro grupo de uma ou mais linhas:sed -e $'/^PS1=/c\ IPeth0=$(Adr=$(ifconfig eth0 |grep inet); echo $Adr | awk \'{print $2}\' | cut -c 6- )\ PS1=\'\d \t \[\e[0;31m\]\u@$IPeth0\[\e[0;32m\]:\[\e[0;36m\]\w# \[\e[m\] \''Eu coloquei toda a string de comando
sedem$'…'então eu poderia usar\'para obter caracteres'não processados na string. Se preferir, você pode usar o provado e verdadeiro
técnica de'$not_a_variable …'"… please don't try to expand those …"'… $not_a_variable'(alternância de cotações).
-
Uma variante acima é
sed -e $'/^PS1=/{s/^/# /; a\ IPeth0=$(Adr=$(ifconfig eth0 |grep inet); echo $Adr | awk \'{print $2}\' | cut -c 6- )\ PS1=\'\d \t \[\e[0;31m\]\u@$IPeth0\[\e[0;32m\]:\[\e[0;36m\]\w# \[\e[m\] \' }'que comenta a definição existente (
s/^/# /) e a pende as novas linhas com o comandoa.