如何在正在运行的 shell 中编辑变量?

wja*_*rea 8 command-line bash

我正在编辑我的 PS1 提示,我不想继续采购我的 bashrc 来更新它(因为我的 bashrc 也会重置其他东西)。我也不想一遍又一遍地复制和粘贴它。有没有办法以交互方式编辑变量,比如使用nano(我的默认编辑器)?

PS1 主要是一个例子,因为我想对其他变量做同样的事情。我想交互式地做的原因是变量已经很长了,我只需要编辑其中的几个字符。而我只需要在当前的 shell 中更改它。

mur*_*uru 8

这是可以做到的。键入var=$var,然后展开并编辑它。要展开,请使用Esc+ Ctrle(默认快捷方式,检查输出bind -p | grep shell-expand-line以确认)。

所以:

muru@muru-1604:~$ PS1=$PS1
Run Code Online (Sandbox Code Playgroud)

会变成:

muru@muru-1604:~$ PS1=${debian_chroot:+($debian_chroot)}\u@\h:\w\$
Run Code Online (Sandbox Code Playgroud)

然后您可以在编辑器中使用Ctrlx Ctrle(edit-and-execute-command在 readline 术语中)进行编辑。保存退出时,保存的内容会被shell执行。

如果您已经PS1=...在您的历史记录中,您可以回到那个和Ctrlx Ctrle.

bash 手册

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

像 shell 一样展开该行。这将执行别名和历史扩展以及所有 shell 单词扩展。

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

在当前命令行调用编辑器,并将结果作为 shell 命令执行。Bash 尝试以该顺序调用 $VISUAL、$EDITOR 和 emacs 作为编辑器。


wja*_*rea 1

Zsh 有一个名为的内置函数vared,可让您内联编辑变量。我编写了自己的版本,最初发布在超级用户上

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

请注意,这与 Zsh 内置函数有一些细微的区别,例如:

  • 如果变量未设置,则不会出错
  • 在打印变量值之前检查变量名称的有效性(例如vared $
  • 截断多行变量。

然后要编辑 PS1,只需运行vared PS1.