【发布时间】:2015-11-24 17:13:19
【问题描述】:
我需要在后台脚本中查看用户的提示输入。 (在 zsh 和 bash 中)。
例如,如果用户输入了
[3:30pm@home]> ssh user@23.23.23.23 ls -alh
我的后台进程在按下回车键之前需要字符串“ssh user@23.23.23.23 ls -alh”。
$PS1 有提示字符串,但没有用户输入。
这可能吗?
对于背景,总体目标是获取用户的部分输入并将 shell 翻译成英文。例如,如果我输入ls -al,我的$PS1 或$PS2 将更改为“列出当前目录中的所有长格式文件”。因此,如果有人不完全记得 -X 或 -x 是否使用 ssh 启用了 X11 转发,他们可以输入它并查看简单的英语翻译是否符合他们的期望。
我希望它是一个 zsh 插件,或者是人们扔到 rc 文件中的脚本,所以不能做任何太重要的事情。
【问题讨论】:
-
您可能可以在
bash中使用DEBUG陷阱,而IIRC 的zle能够在实际执行命令行之前对其进行编辑。不过,这听起来有点像XY problem。为什么需要查看输入? -
您可以覆盖
self-insert小部件并读取$BUFFER,但除非非常仔细地编码,否则它很可能会干扰其他小部件并中断,url-quote-magic是其中之一。这涵盖了部分问题。 -
完整的解决方案需要覆盖几乎所有的小部件。 zsh-syntax-highlighting 和 zsh-autosuggestions 正是这样做的,所以你可以看看(你的问题要简单得多,因为你不操纵缓冲区),但我对他们的实现一点也不满意(我但是不能提出更好的建议),当它们一起使用时变得完全难以管理并且非常脆弱。
-
还要注意
$BUFFER不需要是用户输入(比如当你有predict-on或上面提到的zsh-autosuggestions 时),所以总的来说这是一个很难解决的问题。但是,如果您正在使用一个不允许用户安装插件和/或定义自定义小部件的受控环境(即,您是城里唯一的一个),那么它可能没问题。看起来你所处的环境无论如何都可以被控制,因为你的工具显然只适用于初学者......(但要注意,初学者很难调试东西。) -
现在我想起来了,一个好的起点可能是我上面提到的
predict-on:github.com/zsh-users/zsh/blob/master/Functions/Zle/predict-on,它的攻击性要小得多,并且其代码质量是一致的,从被contrib接受。我仍然认为 zsh-syntax-highlighting 和 zsh-autosuggestions 的 alias/override-everything 方法是疯狂的,在我与他们的短暂经历中,我无法将我的个人设置与他们地狱般的别名/覆盖相协调。