【问题标题】:How to monitor bash/zsh prompt input?如何监控 bash/zsh 提示输入?
【发布时间】: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-highlightingzsh-autosuggestions 正是这样做的,所以你可以看看(你的问题要简单得多,因为你不操纵缓冲区),但我对他们的实现一点也不满意(我但是不能提出更好的建议),当它们一起使用时变得完全难以管理并且非常脆弱。
  • 还要注意$BUFFER 不需要是用户输入(比如当你有predict-on 或上面提到的zsh-autosuggestions 时),所以总的来说这是一个很难解决的问题。但是,如果您正在使用一个不允许用户安装插件和/或定义自定义小部件的受控环境(即,您是城里唯一的一个),那么它可能没问题。看起来你所处的环境无论如何都可以被控制,因为你的工具显然只适用于初学者......(但要注意,初学者很难调试东西。)
  • 现在我想起来了,一个好的起点可能是我上面提到的predict-ongithub.com/zsh-users/zsh/blob/master/Functions/Zle/predict-on,它的攻击性要小得多,并且其代码质量是一致的,从被contrib接受。我仍然认为 zsh-syntax-highlighting 和 zsh-autosuggestions 的 alias/override-everything 方法是疯狂的,在我与他们的短暂经历中,我无法将我的个人设置与他们地狱般的别名/覆盖相协调。

标签: bash shell zsh


【解决方案1】:

您需要实时输入吗?或者至少在该行被接受之前?

对于最后一个选项,zsh 中有一个小部件accept-line,当输入行被接受时触发。您可以使用自己的覆盖默认小部件,如下所示:

function accept-line
{
    #here, send the input to your script
    yourscript "$BUFFER"

    # ... do something here if you want

    # trigger the real widget to accept the line and run the input
    zle .accept-line
}
# register your new accept-line widget to replace the builtin one
zle -N accept-line

这里我使用了名称accept-line,但如果你想将你的覆盖函数命名为my_superOverride,你可以在末尾覆盖默认小部件:

zle -N accept-line my_superOverride

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    • 2013-01-01
    • 2021-06-14
    • 1970-01-01
    相关资源
    最近更新 更多