![如何在正在运行的 shell 中编辑变量?](https://linux22.com/image/1203834/%E5%A6%82%E4%BD%95%E5%9C%A8%E6%AD%A3%E5%9C%A8%E8%BF%90%E8%A1%8C%E7%9A%84%20shell%20%E4%B8%AD%E7%BC%96%E8%BE%91%E5%8F%98%E9%87%8F%EF%BC%9F.png)
我正在编辑我的 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 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 作为编辑器。
答案2
不要获取 bashrc,而是获取另一个仅包含变量的文件。
创造它:
echo "PS1='$PS1'" > /tmp/PS1
注意:如果变量包含单引号,则需要使用可以转义它们的命令,例如:
declare -p PS1 | cut -d' ' -f3- > /tmp/PS1
在编辑器中打开它,例如
nano /tmp/PS1
。- 为了避免
nano
反复运行,您可以在另一个终端/TTY 中运行它,或者使用图形编辑器。
- 为了避免
进行更改并保存。
来源:
source /tmp/PS1
根据需要重复步骤 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
。