具有 bash 可编程补全功能的条件尾随空格

2023-11-26

我正在创建一个函数来为我使用的命令提供可编程完成(在来自http://www.debian-administration.org/articles/317)。 shell脚本的用法如下:

script.sh command [command options]

其中命令可以是“foo”或“bar”,“foo”的命令选项是“a_foo=value”和“b_foo=value”,“bar”的命令选项是“a_bar=value”和“b_bar=value” 。

这是我正在使用的配置:

_script() {
  local cur command all_commands                                                                    
  COMPREPLY=()
  cur="${COMP_WORDS[COMP_CWORD]}"
  command="${COMP_WORDS[1]}"
  all_commands="foo bar"
  case "${command}" in
    foo)
      COMPREPLY=( $(compgen -W "--a_foo --b_foo" -- ${cur}) ); return 0;;
    bar)
      COMPREPLY=( $(compgen -W "--a_bar --b_bar" -- ${cur}) ); return 0;;
    *) ;;
  esac
  COMPREPLY=( $(compgen -W "${all_commands}" -- ${cur}) )
  return 0
}

complete -F _script script.sh

这主要按照我的意愿工作:

% script.sh f[TAB]

完成到:

% script.sh foo 

(根据需要带有尾随空格)

然而,这:

% script.sh foo a[TAB]

完成到:

% script.sh foo a_foo 

(也带有尾随空格)

我想用“=”替换尾随空格。或者,我愿意将传递给 compgen 的值更改为“--a_foo= --b_foo=”,在这种情况下我可以删除尾随空格。

不幸的是,该命令不受我的控制,因此我无法将命令行选项更改为“--a_foo value”格式而不是“--a_foo=value”。


首先,您需要将 = 添加到 COMPREPLY:

COMPREPLY=( $(compgen -W "--a_foo= --b_foo=" -- ${cur}) )

接下来你需要告诉完成不要在 = 之后添加空格

compopt -o nospace

所以,你的脚本行应该是:

foo)
  COMPREPLY=( $(compgen -W "--a_foo= --b_foo=" -- ${cur}) ); compopt -o nospace; return 0;;
bar)
  COMPREPLY=( $(compgen -W "--a_bar= --b_bar=" -- ${cur}) ); compopt -o nospace; return 0;;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有 bash 可编程补全功能的条件尾随空格 的相关文章

  • 嵌入定义绑定变量的 Oracle PL/SQL 代码的 Shell 脚本

    如果我运行下面的脚本 我会收到错误SP2 0552 未声明绑定变量 OUTRES 那么 如何定义绑定变量OUTRES以及在哪里定义呢 usr bin bash sqlplus s scott tiger lt lt EOF declare
  • 无法让 ASCII 艺术回显到控制台

    我是 Bash 脚本新手 这让我感到困惑 我正在将 ASCII 艺术添加到项目中 但似乎无法弄清楚如何转义某些字符 有人可以帮我让下面的代码正常工作吗 每当我尝试添加斜杠作为转义字符来修复错误时 斜杠也会在执行时打印到控制台 这破坏了形象
  • 零垫重命名,例如图片 (2).jpg -> 图片 (002).jpg

    我需要按照标题在所有子文件夹中解释的方式重命名所有图像 我正在考虑用正则表达式提取括号内的数字 然后重命名它 搜索周围我看到有类似的工具rename and mmv但我无法让他们重新命名 jpg 我将不胜感激任何解决我的问题的建议 顺便说一
  • 如何将字符串推送到标准输入?在启动时通过 stdin 提供输入,然后以交互方式读取 stdin 输入 [重复]

    这个问题在这里已经有答案了 有没有办法在调用程序时将字符串 推送 到程序的标准输入流 这样我们就可以达到这样的效果 echo something my program 但不是在之后读取 EOF something my program将从原
  • 我应该使用 AWK 或 SED 删除 CSV 文件中引号之间的逗号吗? (重击)

    我有一堆日常打印机登录CSV格式 我正在编写一个脚本来跟踪使用了多少纸张并将信息保存到数据库中 但我遇到了一个小问题 本质上 日志中的一些文档名称中包含逗号 全部用双引号引起来 并且由于它采用逗号分隔格式 所以我的代码搞乱了并将所有内容推到
  • git 可以知道你当前的分支是从哪个分支分支出来的吗?

    我想创建一个 git 别名 让我可以从其分支的原始分支同步我的分支 例如 如果我从
  • Git - 致命:无法获取当前工作目录?

    When I git clone从回购协议中 我得到 fatal Could not get current working directory No such file or directory 我该怎么办 我检查了服务器并发现 git文
  • 在 sed 中插入换行符 (Mac OS X)

    如何在 sed 的替换部分插入换行符 此代码不起作用 sed s 1234 n 1 g input txt gt output txt 其中 input txt 是 test1234foo123bar1234 和output txt应该是
  • 使用数组参数创建 bash 选择菜单

    我有一个函数叫做createmenu 该函数将接受一个数组作为第一个参数 第二个参数是数组的大小 然后我想使用该数组的元素创建一个选择菜单 这是我到目前为止所拥有的 使用给定数组创建菜单 createmenu echo 1 echo Siz
  • bash 脚本中的变量值不会改变[重复]

    这个问题在这里已经有答案了 运行以下代码 a one echo a a two echo a a three echo a gt a 结果是 one one 以及创建的文件名称为 one 内容为 one 为什么变量没有更改为two在第 2
  • Github 操作 - 错误:进程已完成,退出代码为 1

    我正在尝试设置 github 操作来部署我的应用程序 My bash 启动部署过程的脚本如下所示 bin sh set e vendor bin phpunit git push true git checkout production g
  • 如何在变量中存储标准错误

    假设我有一个如下所示的脚本 无用 sh echo This Is Error 1 gt 2 echo This Is Output 我还有另一个 shell 脚本 也无用 sh useless sh sed s Output Useless
  • 在 Bash 中将命令的输出读取到数组中

    我需要将脚本中命令的输出读取到数组中 该命令例如是 ps aux grep grep x 它逐行给出输出 如下所示 10 20 30 我需要将命令输出中的值读入一个数组 然后如果数组的大小小于三 我将做一些工作 如果命令的输出包含空格 相当
  • 如何通过双击使该 file.sh 可执行?

    首先我用的是Mac 接下来 我需要执行这个 file sh 我们将调用它 每次我需要执行它时 我都必须打开终端并输入 cd Users Jacob Documents folderWithFileInIt bash file sh 这没关系
  • 如何删除名称最大的目录?

    我有一个包含子目录的目录 其中一些名称是数字 不看的话 我不知道数字是多少 如何删除名称最大的子目录 我认为解决方案可能会将子目录按相反顺序排序 并选择以数字开头的第一个子目录 但我不知道该怎么做 感谢您的帮助 cd yourdir go
  • 在 bash 中将 kB 和 GB 转换为 MB

    我使用 awk 和 sed 来获取表中的分区列表及其大小 我想用它来计算各个表的每日增量 这是我的输出 现在我正在努力将所有大小转换为 MB 匹配第二个字段中的数字并根据 MB 或 GB 字符串相乘的最佳 bash 方法是什么 201706
  • 在 bash 脚本中设置变量[重复]

    这个问题在这里已经有答案了 test sh 包含 A 1 B 2 我将 test sh 设置为 chmod 777 我用两个参数启动脚本 test sh first last 然后我通过输入以下内容对其进行了测试 echo FirstVar
  • 如何在 Bash 脚本中将heredoc写入文件?

    如何在 Bash 脚本中将此处文档写入文件 阅读高级 Bash 脚本指南第 19 章此处文档 http tldp org LDP abs html here docs html 这是一个将内容写入文件的示例 tmp yourfilehere
  • 相当于 Python 中的 set -o pipelinefail 吗?

    我有一些 Python 脚本 每个脚本都大量使用排序 uniq ing 计数 gzipping 和gunzipping 以及 awking 第一次运行我使用的代码subprocess call 是的 我知道安全风险 这就是为什么我说这是第一
  • 使用 tac 和 sed 反转文件

    我有一个用例 我需要搜索并替换文件中最后一次出现的字符串并将更改写回文件 下面的案例是该用例的简化版本 我正在尝试反转该文件 进行一些更改 再次将其反转并写入该文件 我为此尝试了以下代码片段 tac test sed s a b sed i

随机推荐

  • 无法解决:com.android.support:appcompat-v7:15.+

    我找到了这个问题的两个解决方案 但都不起作用 所以我决定问问你 我正在使用 Debian 8 Jessie 和 Android Studio 1 4 我刚刚创建了新项目 当我尝试启动它时出现错误 无法解析 com android suppo
  • 删除指针是什么意思?

    删除指针与释放指针 分配内存 相同吗 删除指针 或者删除它指向的内容 意味着 delete p delete p for arrays p在该语句之前分配 例如 p new type 它还可能指使用其他动态内存管理方式 例如free fre
  • 错误代码:1422。存储函数或触发器中不允许显式或隐式提交

    我到处都看到 MySQL 存储过程可以做事务 然而当我声明我的存储函数时 create function test a int returns int MODIFIES SQL DATA BEGIN START TRANSACTION up
  • 如何打开备用网络浏览器(Mozilla 或 Firefox)并显示特定 URL?

    我知道有内置的 Internet Explorer 但我正在寻找的是使用指定的 URL 打开 Firefox Mozilla 窗口 运行应用程序 任何人都可以告诉我如何在 C nET 中做到这一点 你可以这样做 System Diagnos
  • 如何解决“等待调试器”消息?

    我使用 SDK 2 2 将 HTC Comet 连接到 Eclipse 我进行了调试构建 应用程序未运行 尽管它确实安装在设备上 在设备上 我在 Comet 屏幕上看到此消息框 等待调试器应用程序 HunyDew 进程 com airvin
  • 非泛型 IEnumerable 和泛型 IEnumerable 之间有什么区别?

    很抱歉提出这样一个模糊的问题 但我一直在寻找一天中最好的部分 我读了一篇又一篇文章 这里还有很多问题 但就是找不到一个容易理解的答案 我 认为我 知道 IEnumerable 的用途 但我只是无法理解它用泛型类型参数定义时的含义 例如 IE
  • 如何将Lambda表达式转换为Sql?

    我正在开发一个小型框架来访问数据库 我想添加一个使用 lambda 表达式进行查询的功能 我该怎么做呢 public class TestModel public int Id get set public string Name get
  • 为什么 Wrap_Content 多次触发 BindView

    我正在开发一个带有 listView 的 Android 应用程序 并且正在对其进行优化 它在一个活动中使用自定义游标适配器 我注意到 bindview 为列表的每一行触发两次 在研究 BindView 和 NewView 方法时 我在一篇
  • 使用gerrit时,如何删除remotes标签?

    大家 我正在使用 gerrit 但遇到了一些问题 我创建了一个 v1 0 的标签 我现在想从本地和远程删除它 已完成操作 git tag d v1 0 git push origin refs tags v1 0 然后 我遇到了一个错误 r
  • 这个习语是Pythonic吗? (someBool 和“正确结果”或“错误结果”)

    我刚刚在一些开源Python中看到了这个习语 我被饮料噎住了 而不是 if isUp return Up else return Down or even return Up if isUp else Down 代码如下 return is
  • 在 Clojure 中解析 XML

    我是 clojure 新手 所以请耐心等待 我有一个如下所示的 XML
  • 如何在输入密码时将其转换为星号? [复制]

    这个问题在这里已经有答案了 Python 有没有一种方法可以将用户输入的字符转换为星号 就像在许多网站上看到的那样 例如 如果电子邮件用户被要求登录其帐户 则在输入密码时 密码不会显示为字符 而是显示为 每次单独划水后 没有任何时间滞后 如
  • Theano Dimshuffle 相当于 Google 的 TensorFlow 吗?

    我已经看到转置和重塑一起可以提供帮助 但我不知道如何使用 例如 暗淡洗牌 0 x 使用转置和重塑相当于什么 或者 还有更好的方法 谢谢 实现 Theano 的相关操作有三个dimshuffle在 TensorFlow 中 tf transp
  • ThreadLocal 和内存泄漏

    在多个帖子中都提到 不当使用ThreadLocal导致内存泄漏 我正在努力理解内存泄漏是如何发生的ThreadLocal 我想到的唯一场景如下 Web 服务器维护一个线程池 例如 用于 servlet 如果变量在这些线程中 则可能会造成内存
  • JavaScript 中的顺序函数调用

    我希望函数 A 完成执行 只有在函数 B 完成之后才开始执行 当我调用函数 A 然后调用函数 B 时 两者似乎同时执行 在函数 B 完成后 我想调用第三个函数 update dropdown 我的代码如下所示 function A for
  • 如何用纯C优雅地实现一系列不同类型版本的功能?

    我想编写几个仅参数类型不同的函数 我知道 C 有template很好地处理这个问题 虽然还不是很好 很少有编译器支持export关键字 并且查询该关键字是为了提高效率 举个简单的例子 我想要 template
  • 为什么我不应该将所有仅 PL/SQL 的 VARCHAR2 设为 32767 字节?

    或者我应该 标题的灵感来自于加里 迈尔斯 Gary Myers 在为什么 Oracle varchar2 有一个强制大小作为定义参数 考虑以下变量 declare database table column interfacing vari
  • 如何在 VB 和 C# 中从文件加载字体?

    我想从文件加载字体到我的 VB Form 程序中 例如 我的字体位于 exe 程序的同一文件夹中 我希望它保留为外部资源 我们可以替换该资源 以便它更改整个程序的字体 以下是如何在 C 中执行此操作的示例 System Drawing Te
  • 测试 Android IAP/应用内购买订阅

    我正在实现几个要在 Google Play 上启动的 Android 应用程序 它们都使用 Google IAP 自动续订订阅产品类型进行订阅 为了测试该应用程序 我执行了以下操作 已将二进制草案上传到 Google Play 但未发布 在
  • 具有 bash 可编程补全功能的条件尾随空格

    我正在创建一个函数来为我使用的命令提供可编程完成 在来自http www debian administration org articles 317 shell脚本的用法如下 script sh command command optio