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

8

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

O PS1 é principalmente um exemplo, porque eu quero fazer a mesma coisa com outros vars. A razão pela qual eu quero fazer isso de forma interativa é que a variável já é bastante longa, e eu só preciso editar alguns caracteres nela. E eu só preciso mudar isso no shell atual.

    
por wjandrea 27.12.2017 / 00:24

3 respostas

8

Isso pode ser feito. Digite var=$var e depois expanda e edite. Expandir, use Esc + Ctrl e (o atalho padrão, verifique a saída de bind -p | grep shell-expand-line para confirmar).

Então:

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

se tornará:

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

Que você pode editar em um editor com Ctrl x Ctrl e ( edit-and-execute-command em readline termos). Quando você salvar e sair, o conteúdo salvo será executado pelo shell.

Se você já possui PS1=... em seu histórico, basta voltar a ele e Ctrl x Ctrl e .

De manual do bash :

  

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

     

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

     

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

     

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

    
por muru 27.12.2017 / 02:52
1

Em vez de pesquisar o bashrc, crie outro arquivo, que contém apenas a variável.

  1. Crie:

    echo "PS1='$PS1'" > /tmp/PS1
    
    • Observação: 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 em um editor, por exemplo nano /tmp/PS1 .

    • Para evitar a execução de nano repetidamente, você pode executá-lo em outro terminal / TTY ou usar um editor gráfico.
  3. Faça suas alterações e salve.

  4. Fonte:

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

por wjandrea 09.02.2018 / 20:45
0

O Zsh tem um builtin chamado vared que permite editar uma variável inline. Eu escrevi minha própria versão, originalmente postada em Super User :

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

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

  • não haverá erro se a variável não estiver definida
  • Verifica a validade do nome da variável antes imprimir seu valor (por exemplo, vared $ )
  • Trunca variáveis de várias linhas.
por wjandrea 21.04.2018 / 21:44