Como posso editar uma variável em um shell em execução?

8

Estou editando meu prompt do PS1 e não quero continuar procurando meu bashrc para atualizá-lo (já que meu bashrc redefine outras coisas também). Também não quero copiar e colar repetidamente. Existe uma maneira de editar a variável interativamente, como usar nano(meu editor padrão)?

O PS1 é principalmente um exemplo, porque quero fazer a mesma coisa com outros vars. O motivo pelo qual desejo fazer isso de maneira interativa é que a variável já é bastante longa e só preciso editar alguns caracteres nela. E eu só preciso alterá-lo no shell atual.

wjandrea
fonte

Respostas:

8

Isto pode ser feito. Digite var=$vare depois expanda e edite-o. Para expandir, use Esc+ Ctrle(o atalho padrão, verifique a saída de bind -p | grep shell-expand-linepara confirmar).

Assim:

muru@muru-1604:~$ PS1=$PS1

se tornará:

muru@muru-1604:~$ PS1=${debian_chroot:+($debian_chroot)}\u@\h:\w\$

Com o qual você pode editar em um editor Ctrlx Ctrle( edit-and-execute-commandem termos de linha de leitura). Quando você salva e sai, o conteúdo salvo será executado pelo shell.

Se você já possui PS1=...uma história, basta voltar a isso e Ctrlx Ctrle.

A partir do manual do bash :

shell-expand-line (M-C-e)

Expanda a linha como o shell faz. Isso executa expansão de alias e histórico, bem como todas as expansões de palavras shell.

edit-and-execute-command (C-xC-e)

Chame um editor na linha de comando atual e execute o resultado como comandos do shell. O Bash tenta chamar $ VISUAL, $ EDITOR e emacs como editor, nessa ordem.

muru
fonte
Agradável! Apenas Esc, Ctrl + E é exatamente o que eu estava procurando. Embora quando eu digitei PS1='$PS1', ele excluiu as aspas, mas a digitação PS1=\'$PS1\'funciona perfeitamente.
wjandrea
E lendo bind -p, eu também descobri que você pode expandir globs, tildes e linhas de história. Arrumado!
wjandrea
1

Em vez de obter o bashrc, forneça outro arquivo, que apenas contém a variável.

  1. Crie:

    echo "PS1='$PS1'" > /tmp/PS1
    • Nota: Se a variável contiver aspas simples, você precisará usar um comando que possa escapar delas, por exemplo:

      declare -p PS1 | cut -d' ' -f3- > /tmp/PS1
  2. Abra-o em um editor, por exemplo nano /tmp/PS1.

    • Para evitar nanorepetidas vezes, você pode executá-lo em outro terminal / TTY ou usar um editor gráfico.
  3. Faça as alterações e salve.

  4. Fonte:

    source /tmp/PS1
  5. Repita as etapas 3 e 4 conforme necessário.

wjandrea
fonte
1

O Zsh possui um built-in chamado varedque permite editar uma variável embutida. Eu escrevi minha própria versão, originalmente publicada em Super Usuário :

vared(){
    # Based on the zsh builtin of the same name.
    IFS= read -rei "${!1}" "$1"
}

Observe que isso tem algumas diferenças sutis em relação ao Zsh embutido, por exemplo:

  • Não haverá erro se a variável estiver desconfigurada
  • Verifica a validade do nome da variável antes de imprimir seu valor (por exemplo vared $)
  • Trunca variáveis ​​de várias linhas.

Em seguida, para editar o PS1, basta executar vared PS1.

wjandrea
fonte
Aceitando essa resposta porque é o que eu uso mais do dia-a-dia
wjandrea