Bash 补全:compgen 一个单词列表,就好像它们是路径一样 - 仅建议直到下一个斜杠

2023-11-25

我正在为一个 bash 完成脚本工作点文件管理实用程序。该工具有一个命令dots diff [filename]这将显示安装的点文件和源点文件之间的差异。它还有一个命令dots files其中列出了所有托管点文件的路径(相对于源目录)。我想用 files 命令的输出来完成 diff 命令。

这是文件输出的示例

X11/xkb/symbols/evan-custom
X11/xorg.conf.d/10-dual-monitors.conf
X11/xorg.conf.d/10-keylayout.conf
bash/aliases
bash/bashrc
bash/completion.d/dots
bash/profiles/standard-user
bash/profiles/systemd-user
bspwm/bspwmrc
compton/compton.conf
fontconfig/fonts.conf
git/config
git/ignore
gtk-2.0/gtkrc
gtk-3.0/settings.ini
mysql/config
mysql/grcat
ncmpcpp/config
pulse/client.conf
pulse/daemon.conf
pulse/default.pa
ssh/config
sublime-text-3/Packages/User/Preferences.sublime-settings
sxhkd/sxhkdrc
termite/config
transmission-daemon/settings.json
vim/vimrc

使用这样的东西

COMPREPLY=( $(compgen -W "$(dots files)" -- $cur) )

有效,但是当 readline 列出可用选项时,它会列出完整路径(上面的列表)。

我希望它将这些单词视为文件路径,并且在列出建议时仅列出第一个正斜杠。

例如,如果我输入dots diff [tab][tab]应打印以下内容

X11/
bash/
bspwm/
compton/
fontconfig/
git/
gtk-2.0/
gtk-3.0/
mysql/
ncmpcpp/
pulse/
ssh/
sublime-text-3/
sxhkd/
termite/
transmission-daemon/
vim/

例如,如果我然后输入dots diff bash/[tab][tab]然后它会显示

aliases
bashrc
completion.d/
profiles/

理想情况下我希望它实际上把它当作一条路径以便更改 readline 选项mark-directories关闭将排除尾部斜杠。

我尝试过设置compopt -o filenames但这反而给出了文件名的建议,而不是最初的路径。

这是我到目前为止的完成脚本


我已经解决了这个问题。

诀窍是使用compopt -o filename然后切掉正在完成的路径的一部分,即正在完成的目录的子目录。

这是代码

# Do completion from a passed list of paths
#
# Accepts 2 arguments
# 1. The list of paths to complete from
# 2. The current word being completed
__dots_path_comp()
{
    # This forces readline to only display the last item separated by a slash
    compopt -o filenames

    local IFS=$'\n'
    local k="${#COMPREPLY[@]}"

    for path in $(compgen -W "$1" -- $2)
    do
        local trailing_trim

        # Determine what to trim from the end
        trailing_trim="${path#${2%/*}/}/"
        trailing_trim="${trailing_trim#*/}"
        trailing_trim="${trailing_trim%/}"

        # Don't add a space if there is more to complete
        [[ "$trailing_trim" != "" ]] && compopt -o nospace

        # Remove the slash if mark-directories is off
        if ! _rl_enabled mark-directories
        then
            # If The current typed path doesnt have a slash in it yet check if
            # it is the full first portion of a path and ignore everything after
            # if it is. We don't have to do this once the typed path has a slash
            # in it as the logic above will pick up on it
            [[ "$2" != */* && "$path" == ${2}/* ]] && path="$2/$trailing_trim"    

            trailing_trim="/$trailing_trim"
        fi

        COMPREPLY[k++]="${path%%${trailing_trim}}"
    done
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Bash 补全:compgen 一个单词列表,就好像它们是路径一样 - 仅建议直到下一个斜杠 的相关文章

  • 如何并行执行4个shell脚本,我不能使用GNU并行?

    我有4个shell脚本dog sh bird sh cow sh和fox sh 每个文件使用 xargs 并行执行 4 个 wget 来派生一个单独的进程 现在我希望这些脚本本身能够并行执行 由于某些我不知道的可移植性原因 我无法使用 GN
  • 在 docker 中重定向命令输出

    我想为我的服务器做一些简单的日志记录 它是一个在 Docker 容器中运行的小型 Flask 应用程序 这是 Dockerfile Dockerfile FROM dreen flask MAINTAINER dreen WORKDIR s
  • Slurm:提交到多个节点时出错(“slurmstepd:错误:execve():python:没有这样的文件或目录”)

    我有一个 bash 脚本submit sh用于向 Slurm 服务器提交训练作业 其工作原理如下 正在做 bash submit sh p1 8 config file 将提交一些对应的任务config file至 8 个 GPU 分区p1
  • 通过 bash 命令设置 gitlab-ci.yml 变量

    variables CUSTOM NODE VERSION cat nvmrc 我想要变量CUSTOM NODE VERSION通过内容填充 nvmrc文件 位于项目根目录中 如何在gitlab ci yml file 上面的例子不起作用
  • 运行具有外部依赖项的 Scala 脚本

    我在 Users joe scala lib 下有以下 jar commons codec 1 4 jar httpclient 4 1 1 jar httpcore 4 1 jar commons logging 1 1 1 jar ht
  • bash 子 shell 中出现陷阱“kill 0”的分段错误

    我正在尝试编写一个并行构建多个 Dockerfile 的小脚本 但是如果我想取消该脚本 我也想杀死子进程 这样做的结果是segmentation fault 不知道为什么 为了澄清我正在杀死脚本 C trap kill 0 SIGINT S
  • 在 .gitconfig 中隐藏 GitHub 令牌

    我想将所有点文件存储在 GitHub 上 包括 gitconfig 这需要我将 GitHub 令牌隐藏在 gitconfig 中 为此 我有一个 gitconfig hidden token 文件 这是我打算编辑并放在隐藏令牌的 git 下
  • Bash while 循环等待任务完成

    我创建了一个 bash 脚本来处理文件夹及其子文件夹中的视频 find type f name mkv while read file do ffmpeg i file done 问题 它不是 while 循环等待 ffmpeg 完成 而是
  • 如何使用bash脚本获取分区的偏移量?

    我可以用parted找出我的图像的偏移量 sudo parted s image img unit B print Model file Disk home user image img 107374182400B Sector size
  • 添加文件时运行 shell 命令

    我的 Linux 机器上有一个名为 images 的文件夹 该文件夹连接到一个网站 该网站的管理员可以向该网站添加图片 但是 当添加图片时 我想要一个命令来运行调整目录中所有图片的大小 简而言之 我想知道当新文件添加到特定位置时如何使服务器
  • Python DNS服务器IP地址查询

    我正在尝试使用 python 获取 DNS 服务器 IP 地址 要在 Windows 命令提示符下执行此操作 我将使用 ipconfig 全部 如下所示 我想使用 python 脚本做同样的事情 有什么方法可以提取这些值吗 我成功提取了设备
  • 使用脚本从网站中提取电子邮件地址

    给定一个网站 我想知道以编程方式和 或使用脚本的最佳程序是什么 以纯文本形式提取每个页面上存在的所有电子邮件地址 电子邮件受保护 cdn cgi l email protection从该链接和下面的所有站点 递归或直到某个固定深度 使用 s
  • 检查 Git 中是否需要 pull

    如何检查远程存储库是否已更改并且需要拉取 现在我使用这个简单的脚本 git pull dry run grep q v Already up to date changed 1 但它比较重 有没有更好的办法 理想的解决方案是检查所有远程分支
  • Bash:单行命令以与 grep 命令相反的状态退出?

    如何减少以下 bash 脚本 grep P STATUS Perfect recess txt exit 1 exit 0 看起来我应该能够用一个命令来完成它 但我这里总共有 3 个命令 我的程序应该 阅读课间休息 txt 如果它包含 ST
  • 如何在 *nix 中登录时运行脚本?

    我知道我曾经知道如何做到这一点 但是 如何在 unix 中登录时运行脚本 bash 可以 From 维基百科 Bash http en wikipedia org wiki Bash 28Unix shell 29 当 Bash 启动时 它
  • Bash:读入多个局部范围变量

    根据这个答案 https stackoverflow com a 1952480 582917 https stackoverflow com a 1952480 582917 我可以读入并因此分配多个变量 但是我希望这些变量是 bash
  • 在 macOS 上使用 find 时出现“非法选项”错误

    我试图列出末尾仅带有字母 R 的文件 我用了find在 macOS 终端中如下所示 find type f name R 但我收到消息说illegal option t 第一个参数find是它应该开始寻找的路径 路径 表示当前目录 find
  • 测试 bash shell 脚本[重复]

    这个问题在这里已经有答案了 有人可以解释一下如何测试 bash shell 脚本吗 例如 我有一个 sh 文件 其中包含此代码 bin sh for file in txt do mv file basename file txt doc
  • 如何在 Code::Blocks 中启用 C 自动完成?

    如何在 Code Blocks 中启用 C Std lib 函数自动完成 转到 设置 gt 编辑器 gt 代码完成和符号浏览器 并确保未选中 禁用代码完成
  • Bash 循环遍历具有行和列的变量

    经过几个小时的搜索测试不同的解决方案后 我尚未找到可行的解决方案 Bash 和 Shell 脚本不是我的强项 我有一个变量 其中有行 换行 和列 制表符分隔 我想要做的是循环遍历行并获取 Column X 然后将该项目放入变量中 以便我可以

随机推荐

  • 强制 Flutter 导航器在弹出时重新加载状态

    我有一个StatefulWidget在带有按钮的 Flutter 中 它将我导航到另一个StatefulWidget using Navigator push 在第二个小部件上 我正在更改全局状态 一些用户首选项 当我从第二个小部件返回到第
  • 使用 HttpModule Asp.net 重定向 URL

    我创建了一个 HttpModule 这样每当我在浏览器中输入 localhost blabla html 时 它就会将我重定向到 www google com 这只是一个示例 它实际上是重定向来自手机的请求 我的问题是 1 如何告诉IIS
  • SQL 为 null 且 = null [重复]

    这个问题在这里已经有答案了 可能的重复 什么是 null 和 IS NULL IS NULL 和 NULL 有什么区别 有什么区别 where x is null and where x null 为什么后者不起作用 在 SQL 中 比较n
  • Xamarin.Forms - 主/详细信息页面和导航历史记录问题

    我有一个应用程序 它使用 masterdetail 页面在所有页面中显示菜单 在我的应用程序中 导航以两种方式发生 一种方式来自菜单 第二种方式来自仪表板 因此 如果我导航到另一个页面 然后按 返回 按钮 它将关闭应用程序 它不记得导航历史
  • 我的 py2app 应用程序无法打开。有什么问题?

    我正在用 python pygame 和 py2app 编写一个简单的游戏 我使用 python 2 6 当我在别名模式下构建游戏时 它工作正常 但是当我构建部署时 应用程序在午餐后立即崩溃 有人知道发生了什么事吗 为了对整个问题提供更彻底
  • 连续创建位图会导致内存泄漏

    我有一个线程不断生成位图并截取另一个程序窗口的屏幕截图 现在 我的表单上有一个图片框 并且它会随着生成的位图不断更新 这是我在线程中的代码 Bitmap bitmap null while true if listBoxIndex 1 Re
  • 有没有一种可移植的方法来获取Python中的当前用户名?

    什么是获取当前用户用户名的便携方式 例如对于 Linux 和 Windows 类似的东西os getuid 会好的 gt gt gt os getuid 42 Does not currently exist in Python gt gt
  • 无法访问 p:columns 内托管 bean 中的嵌套属性

    我有以下两个简单的 POJO class Person String name Address address and of course the getter setter for the attributes class Address
  • 计算对象检测的混淆矩阵的正确方法是什么?

    我正在尝试计算我的对象检测模型的混淆矩阵 然而 我似乎偶然发现了一些陷阱 我当前的方法是将每个预测框与每个地面实况框进行比较 如果它们的 IoU gt 某个阈值 我会将预测插入到混淆矩阵中 插入后 我删除预测列表中的元素并移至下一个元素 因
  • 核心数据删除规则和多对多关系

    假设您有部门和员工 每个部门有多名员工 但每个员工也可以属于多个部门 所以员工和部门之间是多对多的关系 删除一个部门时 我想删除仅属于该部门的所有员工 并取消属于另一个部门的所有员工与该部门的关系 两个方向的级联规则可以做到这一点吗 或者级
  • 如何在DIV可见之前获取clientWidth和clientHeight

    我想获取 DIV 元素 用于在光标位置显示弹出菜单 的尺寸style display none 但是 DIV 的尺寸始终返回 0 我似乎能够获得尺寸的唯一方法是使 DIVstyle display block 0 0 然后将其移动到所需的位
  • 有条件的 gem 依赖

    是否可以在安装时有条件地设置对 gem 的依赖关系 这是我的情况 希望能澄清这个问题 我维护的 gem 依赖于 json gem 然而 我经常使用 jruby 它有一个名为 json jruby 的 json gem 端口 为了解决这个问题
  • 如何生成n个线程?

    我正在尝试编写一个多线程程序 线程数基于命令行输入 因此我无法对预先声明的线程进行硬编码 这是一种有效的做法吗 int threads 5 dynamic not hard coded int i 0 pthread t thread ma
  • 有人可以向我解释这段 ASP.NET MVC 代码吗?

    这是 ASP NET MVC2 RTM 中的当前代码System Web Mvc AuthorizeAttribute班级 public virtual void OnAuthorization AuthorizationContext f
  • styles_base.xml 文件中出现错误 - android 应用程序 - 找不到与给定名称“android:Widget.Material.ActionButton”匹配的资源

    好的 我是 Android 开发的初学者 我刚刚创建了 hello world 应用程序 但这给了我错误styles base xml文件的appcompat v7图书馆 错误 检索项目的父级时出错 找不到资源 与给定的名称匹配 andro
  • 删除 TFS 2010 中的分支关系

    我刚刚接手了一个 TFS 2010 团队项目 分支层次结构是 Dev 是 Test 的子级 Test 是 Main 的子级 例如 Main Test Dev 然而 在过去的某个时候 有人在 Dev 和 Main 之间进行了毫无根据的合并 这
  • 在 .NET 中获取当前文化日名称

    是否有可能获得CurrentCulture的工作日从DateTimeFormatInfo 但返回Monday作为一周的第一天而不是Sunday 并且 如果当前区域性不是英语 即 ISO 代码不是 en 则将其保留为默认值 默认情况下Cult
  • EntityContainer名称在不同程序集中必须是唯一的?

    我有两个项目 新闻 数据 标签 数据 两者都定义Entities 当我尝试执行时 using var db new News Data Entities name Entities results1 db News ToList using
  • 如何将 SSRS 时间格式转换为 HH:MM AM/PM 格式?

    我的任务是增强以下代码以显示不带秒的时间以及 AM PM IIF Fields New Date Value lt gt NO CHANGE FormatDateTime IIF Fields New Date Value NO CHANG
  • Bash 补全:compgen 一个单词列表,就好像它们是路径一样 - 仅建议直到下一个斜杠

    我正在为一个 bash 完成脚本工作点文件管理实用程序 该工具有一个命令dots diff filename 这将显示安装的点文件和源点文件之间的差异 它还有一个命令dots files其中列出了所有托管点文件的路径 相对于源目录 我想用