¿Cómo puedo editar una variable en un shell en ejecución?

8

Estoy editando mi solicitud de PS1 y no quiero seguir buscando mi bashrc para actualizarlo (ya que mi bashrc también restablece otras cosas). Tampoco quiero copiarlo y pegarlo una y otra vez. ¿Hay alguna manera de editar la variable de forma interactiva, como usar nano(mi editor predeterminado)?

La PS1 es principalmente un ejemplo, porque quiero hacer lo mismo con otras variables. La razón por la que quiero hacerlo de forma interactiva es que la variable ya es bastante larga y solo necesito editar algunos caracteres. Y solo necesito cambiarlo en el shell actual.

wjandrea
fuente

Respuestas:

8

Esto puede hacerse. Escribe var=$vary luego expande y edita. Para expandir, use Esc+ Ctrle(el acceso directo predeterminado, verifique la salida de bind -p | grep shell-expand-linepara confirmar).

Entonces:

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

se convertirá:

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

Que luego puede editar en un editor con Ctrlx Ctrle( edit-and-execute-commanden términos de línea de lectura). Cuando guarde y salga, el contenido guardado será ejecutado por el shell.

Si ya tiene PS1=...en su historial, puede volver a eso y Ctrlx Ctrle.

Del manual de bash :

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

Expande la línea como lo hace el shell. Esto realiza la expansión de alias e historial, así como todas las expansiones de palabras de shell.

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

Invoque un editor en la línea de comando actual y ejecute el resultado como comandos de shell. Bash intenta invocar $ VISUAL, $ EDITOR y emacs como editor, en ese orden.

muru
fuente
¡Agradable! Solo Esc, Ctrl + E es exactamente lo que estaba buscando. Aunque cuando escribí PS1='$PS1', borró las comillas, pero escribir PS1=\'$PS1\'funciona perfectamente.
wjandrea
Y leyendo bind -p, también descubrí que puedes expandir globos, tildes y líneas históricas. ¡Ordenado!
wjandrea
1

En lugar de obtener el bashrc, busque otro archivo que solo contenga la variable

  1. Créalo:

    echo "PS1='$PS1'" > /tmp/PS1
    • Nota: Si la variable contiene comillas simples, deberá usar un comando que pueda escapar de ellas, por ejemplo:

      declare -p PS1 | cut -d' ' -f3- > /tmp/PS1
  2. Ábralo en un editor, por ejemplo nano /tmp/PS1.

    • Para evitar correr nanouna y otra vez, puede ejecutarlo en otro terminal / TTY, o usar un editor gráfico.
  3. Realiza tus cambios y ahorra.

  4. Fuente:

    source /tmp/PS1
  5. Repita los pasos 3 y 4 según sea necesario.

wjandrea
fuente
1

Zsh tiene un nombre incorporado varedque le permite editar una variable en línea. Escribí mi propia versión, originalmente publicada en Super User :

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

Tenga en cuenta que esto tiene algunas diferencias sutiles con respecto al Zsh incorporado, por ejemplo:

  • No se producirá un error si la variable no está configurada
  • Comprueba la validez del nombre de la variable antes de imprimir su valor (p vared $. Ej. )
  • Trunca variables de varias líneas.

Luego, para editar la PS1, simplemente ejecute vared PS1.

wjandrea
fuente
Aceptar esta respuesta porque es lo que uso más día a día
wjandrea