【问题标题】:Check from within bash script that autocompletion is initialized从 bash 脚本中检查自动完成是否已初始化
【发布时间】:2012-07-02 09:14:56
【问题描述】:

我正在寻找一种方法来从我的 shell 脚本中检查脚本特定完成是否已由用户使用 complete -F ... 初始化

我希望此检查打印出有关如何初始化完成的建议,例如:

Warning: Auto completion is not initialized. Please run : source ....; complete -F ...

问题在于,在子 shell 中运行的脚本没有关于用户正在工作的父 shell 的“完整”环境的信息。

所以complete -p| grep my-script-name 永远不会返回任何结果。

用户需要运行“源代码”和“完成”命令或手动将它们添加到他的 .bashrc 中,因为我们正在使用无法访问 bash 完成系统目录的服务器。

或者,如果您知道从脚本中初始化(而不仅仅是检查)自动完成的方法,我很乐意接受。

【问题讨论】:

  • 如果您在这里没有得到答复,您可以尝试在bash-help 邮件列表中询问。

标签: linux bash shell autocomplete sh


【解决方案1】:

您的脚本可以访问父 shell 的此类信息的唯一方法是包含它而不是作为子 shell 执行。您可以设计您的脚本,使其在运行或包含时都能正常工作,而不是指示您的用户可以包含一些配置。

然后,您可以简单地通知您的用户,如果他们想要启用完成,他们需要包含您的脚本,而不是将其作为可执行脚本运行(根据需要使用 source 或 . 的指令)。

但是,在这种情况下,我倾向于在文档中添加此信息或将其添加到始终显示的横幅中(但可以使用 -q 之类的选项开关禁用),而不是支持两种模式运行脚本(因为增益太小了)。

【讨论】:

    【解决方案2】:

    您要么希望每个用户使用 bash 补全(我认为这不好,例如我更喜欢将其关闭),要么让用户自己决定,但让他们在每个 TABTAB 上打印此消息是威胁,你不觉得吗?

    我会将您认为每个用户都应该运行的内容放入 /etc/bash.bashrc。

    【讨论】:

    • 1) 我已经在问题中指定,我们没有对系统目录的写入权限。它是一个服务器。 2) 我不希望在 TABTAB 上收到通知,我希望在用户调用脚本时收到通知。我只是想告诉他,他可以设置完成,这将帮助他使用脚本。3)用户确实想要它 - 我有一个实现的要求。
    • 谢谢你的澄清,我没明白(描述有点乱)。因此,如果除了您自己的用户之外,您无法更改任何内容,您希望如何更改所有用户的完成?
    • 不是针对所有人,而是针对每个人 :) 他/她可以选择手动运行“source ...”或将此命令插入到他们的私有 .bashrc 中。但是,当然,用户应该意识到这种可能性,我只是想为他打印一个公告。
    • 有什么不同?重新制定:如果您只有自己的帐户具有写入权限,您希望如何更改其他用户的配置?
    • 我认为这误解了他的问题,不幸的是,我认为解决方案是 linux 上的安全原则阻止他做他想做的事。他想在父 shell 中检测自动完成,然后通知用户他们有权更改其他用户的配置。我认为这是一个合理的要求。我将发布一个解决方法作为答案。
    猜你喜欢
    • 2012-03-18
    • 2014-08-19
    • 1970-01-01
    • 2011-10-12
    • 2015-05-23
    • 2019-01-25
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    相关资源
    最近更新 更多