Comment puis-je éditer une variable dans un shell en cours d'exécution?

8

J'édite mon invite PS1 et je ne veux pas continuer à sourcer mon bashrc pour le mettre à jour (car mon bashrc réinitialise aussi d'autres choses). Je ne veux pas non plus le copier et le coller encore et encore. Existe-t-il un moyen de modifier la variable de manière interactive, comme en utilisant nano(mon éditeur par défaut)?

La PS1 est surtout un exemple, car je veux faire la même chose avec d'autres vars. La raison pour laquelle je veux le faire de manière interactive est que la variable est déjà assez longue, et je dois juste y éditer quelques caractères. Et je n'ai besoin que de le changer dans le shell actuel.

wjandrea
la source

Réponses:

8

Ceci peut être fait. Tapez var=$var, puis développez et modifiez-le. Pour développer, utilisez Esc+ Ctrle(le raccourci par défaut, vérifiez la sortie de bind -p | grep shell-expand-linepour confirmer).

Donc:

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

va devenir:

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

Que vous pouvez ensuite modifier dans un éditeur avec Ctrlx Ctrle( edit-and-execute-commanden termes de ligne de lecture). Lorsque vous enregistrez et quittez, le contenu enregistré sera exécuté par le shell.

Si vous en avez déjà PS1=...dans votre histoire, vous pouvez simplement y revenir et Ctrlx Ctrle.

Du manuel bash :

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

Développez la ligne comme le fait le shell. Ceci effectue un développement d'alias et d'historique ainsi que toutes les extensions de mots shell.

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

Appelez un éditeur sur la ligne de commande actuelle et exécutez le résultat en tant que commandes shell. Bash tente d'appeler $ VISUAL, $ EDITOR et emacs en tant qu'éditeur, dans cet ordre.

muru
la source
Agréable! Just Esc, Ctrl + E est exactement ce que je cherchais. Bien que lorsque j'ai tapé PS1='$PS1', cela a supprimé les guillemets, mais la frappe PS1=\'$PS1\'fonctionne parfaitement.
wjandrea
Et en lisant bind -p, j'ai également découvert que vous pouvez étendre des globes, des tildes et des lignes d'histoire. Soigné!
wjandrea
1

Au lieu de sourcer le bashrc, sourcez un autre fichier, qui contient juste la variable.

  1. Créez-le:

    echo "PS1='$PS1'" > /tmp/PS1
    • Remarque: Si la variable contient des guillemets simples, vous devrez utiliser une commande qui peut les échapper, par exemple:

      declare -p PS1 | cut -d' ' -f3- > /tmp/PS1
  2. Ouvrez-le dans un éditeur, par exemple nano /tmp/PS1.

    • Pour éviter de courir nanoencore et encore, vous pouvez l'exécuter dans un autre terminal / TTY, ou utiliser un éditeur graphique.
  3. Apportez vos modifications et enregistrez.

  4. Source:

    source /tmp/PS1
  5. Répétez les étapes 3 et 4 si nécessaire.

wjandrea
la source
1

Zsh a un intégré appelé varedqui vous permet de modifier une variable en ligne. J'ai écrit ma propre version, initialement publiée sur Super User :

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

Notez que cela présente quelques différences subtiles par rapport au module intégré Zsh, par exemple:

  • Ne générera pas d'erreur si la variable n'est pas définie
  • Vérifie la validité du nom de la variable avant d' imprimer sa valeur (par exemple vared $)
  • Tronque les variables multilignes.

Ensuite, pour éditer la PS1, lancez-le vared PS1.

wjandrea
la source
Accepter cette réponse parce que c'est ce que j'utilise le plus au quotidien
wjandrea