从脚本中使用zsh变量进行行编辑

从脚本中使用zsh变量进行行编辑,zsh,Zsh,当使用macOS 11的stock/bin/zsh shell zsh 5.8 x86_64-apple-darwin20.0时,我可以在shell中运行以下命令,并将提示预先填充一些值: 变量=somevalue vared-p提示符:变量 正如预期的那样,我可以使用标准的行编辑按键编辑somevalue预填充值 但是,如果我将这些确切的命令放入testinput.zsh脚本并运行它,系统会提示我输入somevalue,但它是不可编辑的:键盘命令不允许编辑somevalue值。我甚至不能点击d

当使用macOS 11的stock/bin/zsh shell zsh 5.8 x86_64-apple-darwin20.0时,我可以在shell中运行以下命令,并将提示预先填充一些值:

变量=somevalue vared-p提示符:变量 正如预期的那样,我可以使用标准的行编辑按键编辑somevalue预填充值

但是,如果我将这些确切的命令放入testinput.zsh脚本并运行它,系统会提示我输入somevalue,但它是不可编辑的:键盘命令不允许编辑somevalue值。我甚至不能点击delete来清除该值并输入我自己的值,因此无法覆盖传递给vared的默认值,从而使其变得无用

这可以通过一些设置来控制吗?我发现,如果我向脚本中添加-I标志,它将起作用,如下所示:

!/bin/zsh-i 变量=值 vared-p提示符:变量 但是,这似乎有副作用,如使用-i运行时脚本的输出所示:

Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.
我的问题是:有没有办法强制vared进入交互模式,以便行编辑键绑定工作?如果没有,是否有任何方法可以检测vared何时不会处于交互模式(例如,基于某些tty设置),以便我至少可以避免向用户添加他们无法更改的预填充变量

更新:上下文是,这是一组随项目分发的脚本的一部分,让用户处理他们的.zshrc或其他配置环境不是一个选项。我需要弄清楚如何识别用户何时会遇到与我看到的问题相同的问题,或者绕过限制,或者只是识别它,以防止vared让用户的配置属性保留不可编辑的默认值。

适合我。例如:

我创建了一个包含这两行的脚本

vared XX
echo New value: $XX
并将其作为

XX=A zsh ve
我可以编辑XX并得到新的值:打印在标准输出上的编辑值。

我猜您已经将编辑器设置为某种vi风格。您可以通过在脚本中添加bindkey-Ll main来检查这一点-如果我是对的,它将打印bindkey-A viins main。您的变量是可编辑的,但编辑器使用的是vi仿真模式——具体来说是viins,因此您需要按ESC键才能四处移动并删除现有内容。通过启动一个子zsh,只需键入zsh并像以前一样尝试使用vared,就可以交互地看到相同的效果。相关文档位位于zshzle1,关键地图:

…emacs或viins也链接到名称main。当shell启动时,如果其中一个VISUAL或EDITOR环境变量包含字符串vi,那么它将是viins,否则它将是emacs

这在您的登录shell中不是一个问题,或者,很明显,这是一个交互式的问题,因为编辑器最初是未设置的,所以除非您特别重写它,否则您将获得emacs。但是,命令的shell继承自定义编辑器并选择viins。我可以想出几个选择:

学会爱上vared中的vi模式。 使用vared-memacs覆盖zsh的选择。 通过使用未定义的编辑器(例如,EDITOR=./test.zsh)调用脚本来覆盖zsh的选择。这与前面的选项略有不同,因为它使用zsh的默认行为,而不是专门选择emacs。
另外,由于脚本是作为可执行文件而不是函数编写的,因此它对变量所做的更改在调用shell中不可见。这可能是您想要的,也可能不是您想要的。

我对zsh不是很熟悉,但这可能是因为一个shell是交互式的,而另一个作为简单的脚本解释器运行。您使用的是哪个终端?terminal.app,AFAIK,具有TTY行为方面的所有默认设置。对我不起作用:相同的问题。您在哪个平台/版本的zsh上运行?在Cygwin上运行的zsh 5.8。理论上,这可能是zsh版本的问题,但如果是这样的话,我会感到惊讶。你能在评论中发布一个屏幕截图来证明我的例子在你这边不起作用吗?做一只猫;XX=zsh ve并编辑变量,然后进行屏幕截图。