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

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

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

PS1 主要是一个示例,因为我想对其他变量执行相同的操作。我想以交互方式执行此操作的原因是该变量已经很长了,我只需要在其中编辑几个字符。而且我只需要在当前 shell 中更改它。

答案1

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

所以:

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

会变成:

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

然后,您可以使用编辑器编辑它Ctrlx Ctrleedit-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 作为编辑器。

答案2

不要获取 bashrc,而是获取另一个仅包含变量的文件。

  1. 创造它:

    echo "PS1='$PS1'" > /tmp/PS1
    
    • 注意:如果变量包含单引号,则需要使用可以转义它们的命令,例如:

      declare -p PS1 | cut -d' ' -f3- > /tmp/PS1
      
  2. 在编辑器中打开它,例如nano /tmp/PS1

    • 为了避免nano反复运行,您可以在另一个终端/TTY 中运行它,或者使用图形编辑器。
  3. 进行更改并保存。

  4. 来源:

    source /tmp/PS1
    
  5. 根据需要重复步骤 3 和 4。

答案3

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

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

请注意,这与 Zsh 内置命令有一些细微的差别,例如:

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

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

相关内容