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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/845370.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ffmpeg在特定时间点插入素材

如果要在视频的特定时间戳处插入图片,则可以使用以下命令: ffmpeg -i input.mp4 -i image.png -filter_complex “[0:v][1:v]overlay100💯enable‘between(t,5,10)’” -c:a copy output.mp4 这里使用了enable选项,指定了图片插入…

TPM之VMK密封

本篇文章主要介绍基于TPM的Bitlocker全盘加密时,VMK密钥的密封(Seal)流程,至于TPM、Bitlocker、密钥保护器、VMK密钥等这些东西是什么,这里不做解释,需要自己脑补一下(╮(╯▽╰)╭)…

【HarmonyOS】输入框焦点控制实现键盘显隐

【HarmonyOS】输入框焦点控制实现键盘显隐 问题背景: 鸿蒙中输入框控件,TextInput最常见的控制,即:针对输入框焦点控制,获取焦点,失去焦点。达到用户方便操作输入和退出输入。 因为输入框一定会伴随着键盘…

42.开发中对String.format()的使用之空位补齐

用于空位补齐 Int x1; //对于传入的数字做处理,如果传入的数字不足三位,则使用数字0自动补齐 String numString.format(“%”3”d”,x); System.out.println(“num”num);//输出结果为:001 也可以简写成: String num2String…

2024年大屏幕互动源码+动态背景图和配乐素材+搭建教程

2024年大屏幕互动源码动态背景图和配乐素材搭建教程 php宝塔搭建部署活动现场大屏幕互动系统php源码 运行环境:PHPMYSQL 下载源码地址:极速云

jenkins禁用所有job

背景 需要对jenkins做迁移,但是老的jenkins需要保留一段时间,先把老的jenkins所有job禁用掉 禁用多分支pipeline 找到Manage Jenkins>Script Console 输入下面的脚本 import hudson.model.*disableChildren(Hudson.instance.items)def disableChi…

数据库设计:实体关系图

一个良好的设计对于数据库系统至关重要,它可以减少数据冗余,确保数据的一致性和完整性,同时使得数据库易于维护和扩展。 实体关系图(Entity-Relationship Diagram、ERD)是一种用于数据库设计的结构图,它描…

Webrtc支持HEVC之FFMPEG支持HEVC编解码(一)

一、前言 Webrtc使用的FFMPEG(webrtc\src\third_party\ffmpeg)和官方的不太一样,使用GN编译,各个平台使用了不一样的配置文件 以Windows为例,Chrome浏览器也类似 二、修改配置文件 windows:chromium\config\Chrome\win\x64 其他平台: chromium\config\Chrome\YOUR_SYS…

java函数式接口

函数式接口定义:接口中有且仅有一个抽象方法的接口即为函数式接口,可以使用FunctionalInterface检查定义的接口是否是一个函数式接口,函数式接口可以采用lambda表达式。语法格式如下: import java.util.function.Consumer; Func…

ARM32开发——第一盏灯

🎬 秋野酱:《个人主页》 🔥 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 开发流程需求分析项目新建代码编写GPIO初始化 程序编译程序烧录烧录扩展(熟悉)官方烧录器烧录(…

自制F1C200S demo板(八、Linux初学3)

uboot执行流程学习 uboot执行流程文件路径: 1、uboot/arch/arm/cpu/arm926ejs/start.S,执行结束会跳转到_main部分,处于下一路径中 2、uboot/arch/arm/lib/crt0.S,执行到 mov r0, #0 bl board_init_f 会跳转到void …

今日总结2024/5/31

今日熟悉了常用库函数,并查集,常用建边方式 明天蓝桥杯国赛随缘了,第一次估计也是最后一次了 LQOJ.269 排列序数 如果用 a b c d 这 4 个字母组成一个串,有 4!24 种,如果把它们排个序,每个串都对应一个序号&#xf…

陪玩小程序都需要怎么做?

开发陪玩小程序需要进行全面的需求分析、功能规划、技术选型、界面设计等一系列步骤。陪玩小程序作为一种新兴的网络服务平台,为用户提供了寻找游戏伙伴、预约陪玩服务等功能,满足了用户在游戏领域的社交互动和技能提升需求。具体分析如下: 需…

一份不知道哪里来的第十五届国赛模拟题

这是一个不知道来源的模拟题目,没有完全完成,只作代码记录,不作分析和展示,极其冗长,但里面有长按短按双击的复合,可以看看。 目录 题目代码底层驱动主程序核心代码关键:双击单击长按复合代码 …

Flutter 中的 SliverPadding 小部件:全面指南

Flutter 中的 SliverPadding 小部件:全面指南 Flutter 是一个功能丰富的 UI 框架,由 Google 开发,允许开发者使用 Dart 语言来构建高性能、美观的跨平台应用。在 Flutter 的滚动组件体系中,SliverPadding 是一个用来为其子 Slive…

今日学会的,刘姥姥进大观园

Git - First-Time Git Setup 下载了Git,会用Git了? 还有这个:学习 HTML5 Canvas 这一篇文章就够了 | 菜鸟教程 (runoob.com) JavaScript 用法 | 菜鸟教程 (runoob.com) 看到这个真的是受益匪浅,我终于懂了一直有的疑惑。 3D可…

js 正则匹配返回所有匹配到的范围

js正则默认不返回匹配到的范围,有些场景用起来就不太方便。如果想针对于匹配到的位置多次操作就要另外想个办法了。 indexOf 这个只能获取到第一个出现的位置,其他位置不太行,这个方法好像就行不通了。 自己一个个找,写个kmp算法感…

Mock的用法

1. 引入unittest包,再从包里引用mock类 import unittest from unittest import Mock 2. mock的作用,做挡板或者用来做一些单元测试过程中复杂的数据的模拟 demo Demo() #把mock的值赋值给demo的get()方法,这样在调用这个方法时&#xff0…

RAG技术探索

什么是RAG 1 RAG原理 RAG(Retrieval Augmented Generation, 检索增强生成),即LLM在回答问题或生成文本时,先会从大量文档中检索出相关的信息,然后基于这些信息生成回答或文本,从而提高预测质量。RAG模型尤…

数据在内存中的存储<C语言>

导言 在计算机中不同类型的数据在计算机内部存储形式各不相同,弄懂各种数据在计算机内部存储形式是有必要的,C语言的学习不能浮于表面,更要锻炼我们的“内功”,将来在写程序的时候遇见各种稀奇古怪的bug时,也便能迎刃而…