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


8

我正在编辑我的PS1提示符,但我不想继续寻找我的bashrc来更新它(因为我的bashrc也重置了其他东西)。我也不想一遍又一遍地复制和粘贴。有没有办法像使用nano(我的默认编辑器)那样交互式地编辑变量?

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

Answers:


8

可以做到的。键入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在阅读行中)在编辑器中进行编辑。当您保存并退出时,保存的内容将由外壳执行。

如果您已经有PS1=...自己的历史记录,则可以返回到和Ctrlx Ctrle

bash手册

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

像外壳一样展开线。这将执行别名和历史记录扩展以及所有shell单词扩展。

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

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


真好!只是Esc,Ctrl + E正是我想要的。虽然当我键入时PS1='$PS1',它删除了引号,但键入PS1=\'$PS1\'效果很好。
wjandrea

通读bind -p,我还发现您可以扩展glob,波浪号和历史记录行。整齐!
wjandrea

1

而不是采购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。


1

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

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

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

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

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


接受这个答案是因为这是我每天最常使用的
wjandrea
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.