当前位置: 首页 > news >正文

Linux的命令补全脚本

一 linux命令补全脚本

Linux的命令补全脚本是一个强大且高效的工具,它能够极大地提高用户在命令行界面的工作效率。这种脚本通过自动完成部分输入的命令或参数,帮助用户减少敲击键盘的次数并降低出错率。接下来将深入探讨其工作原理、安装方式以及如何自定义这些脚本:

1. 工作原理
   - 在Linux系统中,命令补全是通过Bash Shell的特性来实现的。Bash Shell内置了补全机制,允许用户在输入命令时通过按下Tab键来激活补全功能。这个特性虽然基础,但是已经可以提供一定程度的命令补全。
   - Bash4之后的版本中,为了增强补全功能,引入了bash-completion软件包。该软件包提供了更为丰富的命令补全脚本和函数库,使得补全功能更加智能和用户友好。


2. 安装配置
   - 可以通过包管理器(如yum或apt)来安装bash-completion软件包。例如,使用yum的安装命令为`yum install -y bash-completion`。
   - 安装完成后,为了使补全功能生效,需要配置Bash Shell以加载补全脚本。这通常是通过编辑`/etc/profile.d/bash_completion.sh`文件来完成的。


3. 编写脚本
   - 补全脚本通常存放在`/etc/bash_completion.d/`目录下。每个脚本的名称通常与其补全的命令名称相对应,方便管理和查找。
   - 编写补全脚本时,可以使用Bash内置的compgen和complete命令。compgen用于生成候选补全列表,而complete则用于定义特定命令的补全行为。


4. 使用实例
   - 一个简单的补全脚本可能会定义一个补全函数,该函数使用compgen命令生成匹配当前已输入字符的单词列表,然后通过complete命令将此函数绑定到特定的命令上。
   - 对于更复杂的需求,比如多级补全,脚本可能需要根据不同的上下文(如已输入的命令和参数)来决定显示哪些补全选项。这可以通过结合COMP_WORDS、COMP_CWORD等Bash内置变量来实现。


5. 高级应用
   - 除了基本的命令和文件名补全外,bash-completion还支持参数和选项的补全。这对于快速选择命令的参数非常有用,尤其是当参数众多或者不易记忆时。
   - 对于软件开发者而言,bash-completion也提供了一种手段来为自定义脚本或程序创建补全脚本,从而提升最终用户的使用体验。

总结来说,Linux下的命令补全脚本不仅提高了命令输入的效率,还降低了操作的错误率。通过合理利用bash-completion软件包及其提供的脚本和函数库,用户可以享受到更智能、更便捷的命令行交互体验。

二 自定义命令补全脚本

为程序自定义Linux的命令补全脚本涉及到编写特定的shell脚本,以扩展或改进Bash的自动补全功能。这些脚本利用了Bash提供的内置命令和变量来生成匹配用户输入的补全候选列表。下面将具体探讨如何为程序创建自定义的补全脚本:

1. 理解基本概念
   - 内置命令与变量:为了编写自定义的补全脚本,需要了解`compgen`和`complete`这两个Bash内置命令,以及`COMP_WORDS`、`COMP_CWORD`和`COMPREPLY`等重要的系统参数。
   - 补全机制概述:Bash Shell自带的补全功能可以通过按下Tab键激活,而bash-completion软件包则提供了增强的补全支持,包括对自定义脚本的支持。


2. 准备环境
   - 安装bash-completion:如果尚未安装bash-completion,需要先通过包管理器进行安装。这个包包含了基本的补全框架和许多现成的补全脚本。
   - 确保加载补全脚本:确认Bash初始化时会加载bash-completion提供的主脚本,这通常在`/etc/profile.d/bash_completion.sh`中设置。


3. 编写补全脚本
   - 定义补全函数:创建一个补全函数,例如`_myprogram()`,在这个函数中,使用`compgen`命令根据用户的当前输入(由`$COMP_WORDS`和`$COMP_CWORD`表示)生成补全候选列表。
   - 使用local变量:在补全函数中,定义局部变量`cur`和`prev`来分别表示当前光标下的单词和前一个单词,这对于确定补全逻辑很重要。


4. 绑定补全函数
   - 应用complete命令:使用`complete`命令将定义好的补全函数绑定到特定的命令上。例如,`complete -F _myprogram myprogram`告诉Shell,当用户尝试补全`myprogram`命令时,应调用`_myprogram`函数。


5. 配置脚本位置
   - 保存脚本位置:将自定义的补全脚本保存在`/etc/bash_completion.d/`目录下,这样它就可以被bash-completion的主脚本自动发现和加载。


6. 测试验证
   - 测试补全功能:在实际环境中测试自定义的补全脚本,确保它能正确工作。可以尝试输入命令并按下Tab键,查看是否显示了预期的补全选项。


7. 高级应用
   - 处理复杂场景:对于更复杂的补全逻辑,比如需要根据不同的命令选项显示不同的补全列表,可以在补全函数中使用条件语句来实现。
   - 优化用户体验:为了使补全更加用户友好,可以考虑到补全速度、候选列表的显示格式和过滤算法等方面进行优化。

通过以上步骤,可以为Linux环境下的程序创建自定义的命令补全脚本,显著提升命令行工具的使用效率和用户体验。这不仅有助于减少命令输入的错误,还能加快日常工作的流程,特别是对于经常使用命令行操作的用户来说,这是一个非常有价值的功能。

三 举例

样例一:ninja的命令补全脚本:

# Add the following to your .bashrc to tab-complete ninja targets
#   . path/to/ninja/misc/bash-completion_ninja_target() {local cur prev targets dir line targets_command OPTIND# When available, use bash_completion to:#   1) Complete words when the cursor is in the middle of the word#   2) Complete paths with files or directories, as appropriateif _get_comp_words_by_ref cur prev &>/dev/null ; thencase $prev in-f)_filedirreturn 0;;-C)_filedir -dreturn 0;;esacelsecur="${COMP_WORDS[COMP_CWORD]}"fiif [[ "$cur" == "--"* ]]; then# there is currently only one argument that takes --COMPREPLY=($(compgen -P '--' -W 'version' -- "${cur:2}"))elsedir="."line=$(echo ${COMP_LINE} | cut -d" " -f 2-)# filter out all non relevant arguments but keep C for dirswhile getopts :C:f:j:l:k:nvd:t: opt $line; docase $opt in# eval for tilde expansionC) eval dir="$OPTARG" ;;esacdone;targets_command="eval ninja -C \"${dir}\" -t targets all"targets=$((${targets_command} 2>/dev/null) | awk -F: '{print $1}')COMPREPLY=($(compgen -W "$targets" -- "$cur"))fireturn
}
complete -F _ninja_target ninja

_get_comp_words_by_ref是一个bash shell函数,用于获取当前命令行中的所有单词。它通过引用传递参数的方式返回一个数组,其中包含了当前命令行中的所有单词。

这个函数的实现通常如下所示:


_get_comp_words_by_ref() {local words=("${COMP_WORDS[@]}")printf "%s
" "${words[@]}"
}

样例二:


# 编辑文件内容
_mycommand() {local cur=${COMP_WORDS[COMP_CWORD]}local options="-a -b"COMPREPLY=($(compgen -W "${options}" -- ${cur}))
}complete -F _mycommand mycommand

相关文章:

Linux的命令补全脚本

一 linux命令补全脚本 Linux的命令补全脚本是一个强大且高效的工具,它能够极大地提高用户在命令行界面的工作效率。这种脚本通过自动完成部分输入的命令或参数,帮助用户减少敲击键盘的次数并降低出错率。接下来将深入探讨其工作原理、安装方式以及如何自…...

前端 JS 经典:打印对象的 bug

1. 问题 相信这个 console 打印语句的 bug,其实小伙伴们是遇到过的,就是你有一个对象,通过 console,打印一次,然后经过一些处理,再通过 console 打印,发现两次打印的结果是一样的,第…...

大型语言模型简介

大型语言模型简介 大型语言模型 (LLM) 是一种深度学习算法,可以使用非常大的数据集识别、总结、翻译、预测和生成内容。 文章目录 大型语言模型简介什么是大型语言模型?为什么大型语言模型很重要?什么是大型语言模型示例?大型语…...

javaWeb4 Maven

Maven-管理和构建java项目的工具 基于POM的概念 1.依赖管理:管理项目依赖的jar包 ,避免版本冲突 2.统一项目结构:比如统一eclipse IDEA等开发工具 3.项目构建:标准跨平台的自动化项目构建方式。有标准构建流程,能快速…...

eclipse连接后端mysql数据库并且查询

教学视频:https://www.bilibili.com/video/BV1mK4y157kE/?spm_id_from333.337.search-card.all.click&vd_source26e80390f500a7ceea611e29c7bcea38本人eclipse和up主不同的地方如下,右键项目名称->build path->configure build path->Libr…...

Windows mstsc

windows mstsc 局域网远程计算机192.168.0.113为例,远程控制命令mstsc...

百度/迅雷/夸克,网盘免费加速,已破!

哈喽,各位小伙伴们好,我是给大家带来各类黑科技与前沿资讯的小武。 之前给大家安利了百度网盘及迅雷的加速方法,详细方法及获取参考之前文章: 刚刚!度盘、某雷已破!速度50M/s! 本次主要介绍夸…...

SOA的参考架构

1. 以服务为中心的企业集成架构 IBM的Websphere业务集成参考架构(如图1所示,以下称参考架构)是典型的以服务为中心的企业集成架构。 图1 IBM WebSphere业务集成参考架构 以服务为中心的企业集成采用“关注点分离(Separation of Co…...

前端开发-表单和表格的区别

在前端开发中,表单(Form)和表格(Table)同样具有不同的用途和结构: 前端表单(Form): 数据收集:表单用于收集用户输入的数据,如文本输入、选择选项等。用户交…...

Data Management Controls

Data Browsing and Analysis Data Grid 以标准表格或其他视图格式(例如,带状网格、卡片、瓷砖)显示数据。Vertical Grid 以表格形式显示数据,数据字段显示为行,记录显示为列。Pivot Grid 模拟微软Excel的枢轴表功…...

NextJs 数据篇 - 数据获取 | 缓存 | Server Actions

NextJs 数据篇 - 数据获取 | 缓存 | Server Actions 前言一. 数据获取 fetch1.1 缓存 caching① 服务端组件使用fetch② 路由处理器 GET 请求使用fetch 1.2 重新验证 revalidating① 基于时间的重新验证② 按需重新验证revalidatePathrevalidateTag 1.3 缓存的退出方式 二. Ser…...

腾讯开源人像照片生成视频模型V-Express

网址 https://github.com/tencent-ailab/V-Express 下面是github里的翻译: 在人像视频生成领域,使用单张图像生成人像视频变得越来越普遍。一种常见的方法是利用生成模型来增强受控发电的适配器。 但是,控制信号的强度可能会有所不同&…...

pytorch使用DataParallel并行化保存和加载模型(单卡、多卡各种情况讲解)

话不多说,直接进入正题。 !!!不过要注意一点,本文保存模型采用的都是只保存模型参数的情况,而不是保存整个模型的情况。一定要看清楚再用啊! 1 单卡训练,单卡加载 #保存模型 torc…...

PS初级|写在纸上的字怎么抠成透明背景?

前言 上一次咱们讲了很多很多很多的抠图教程,这次继续。。。最近有小伙伴问我:如果是写在纸上的字,要怎么把它抠成透明背景。 这个其实很简单,直接来说就是选择通道来抠。但有一点要注意的是,写在纸上的字&#xff0…...

Docker面试整理-Docker的网络是如何工作的?

Docker 的网络功能允许容器以多种方式连接到彼此、宿主机以及外部网络。Docker 使用不同的网络驱动来支持这些连接,每种驱动方式都适用于特定的用途。理解 Docker 的网络是如何工作的,可以帮助你更好地设计和管理容器化应用的通信。 Docker 网络驱动 bridge:默认网络驱动。当…...

获得抖音商品评论 API 返回值

公共参数 名称类型必须描述keyString是调用key(获取key和密钥​​​​​​​)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等]cacheString否[yes,no]默认yes&am…...

Qt | QtBluetooth(蓝牙电脑当服务端+手机当客户端) 配对成功啦

01、前言 没有演示,因为穷,电脑没有带蓝牙,但是已在其他电脑进行演示,可以满足配对,后期再补充和手机进行聊天,如果有聊天的记得私聊我,好处大大滴。02、QtBlueTooth 简介 QtBluetooth 是一个跨平台的蓝牙库,它允许开发者创建在支持蓝牙的设备上运行的应用程序。这个库…...

我找到了全网最低价买服务器的 bug !!!

拍断大腿 周五,放松一下,给大家分享下我最近的事儿,以及带大家薅个(可能会有)的羊毛。 上个月,家里买了 Apple TV(可理解为苹果的电视盒子)装了 infuse(一个在电视盒子上…...

聚类的外部指标(Purity, ARI, NMI, ACC) 和内部指标(NCC,Entropy,Compactness,Silhouette Index)

在聚类分析中,外部指标和内部指标用于评估聚类结果的质量。外部指标需要知道真实的类别标签,而内部指标则仅基于聚类结果本身进行评估。 外部指标 Purity (纯度): 计算聚类结果中每个簇中最多数目的样本所属的类别,并计算所有簇的该类别样本数之和占所有样本数的比例。 Pyt…...

国标GB/T 28181详解:国标GBT28181-2022的客户端主动发起历史视音频回放流程

目录 一、定义 二、作用 1、提供有效的数据回顾机制 2、增强监控系统的功能性 3、保障数据传输与存储的可靠性 4、实现精细化的操作与控制 5、促进监控系统的集成与发展 三、历史视音频回放的基本要求 四、命令流程 1、流程图 2、流程描述 五、协议接口 1、会话控…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...

爬虫基础学习day2

# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...