自定義linux命令參數補全以提高工作效率

来源:https://www.cnblogs.com/kingstarer/archive/2020/03/28/12586721.html
-Advertisement-
Play Games

我們在使用bash命令時,會經常使用二次tab鍵進行補齊。 例如我們常用的telnet命令,在輸入二次tab鍵時,會列出當前系統配置的所有主機名,供選擇 # 輸入 telnet <Tab> <Tab> [huangcihui:/home/huangcihui] telnet ::1 localhos ...


  我們在使用bash命令時,會經常使用二次tab鍵進行補齊。

      例如我們常用的telnet命令,在輸入二次tab鍵時,會列出當前系統配置的所有主機名,供選擇

# 輸入 telnet <Tab> <Tab>
[huangcihui:/home/huangcihui] telnet 
::1                      localhost                localhost4               localhost4.localdomain4  localhost6               localhost6.localdomain6  localhost.localdomain    
[huangcihui:/home/huangcihui] telnet 

     在輸入telnet參數過程中按回車,系統也會自動補全主機名

#輸入 telnet l<Tab>
[huangcihui:/home/huangcihui] telnet localhost

  其它常用命令,也會有這個功能。 例如systemctl,輸入二次tab鍵時會列出systemctl所有子命令參數

#systemctl <Tab><Tab>
[huangcihui:/home/huangcihui] systemctl 
add-requires           daemon-reexec          enable                 hybrid-sleep           kill                   list-units             reload-or-restart      set-property           suspend                
add-wants              daemon-reload          exit                   is-active              link                   mask                   reload-or-try-restart  show                   switch-root            
cancel                 default                force-reload           is-enabled             list-dependencies      poweroff               rescue                 show-environment       try-restart            
cat                    delete                 get-default            is-failed              list-jobs              preset                 reset-failed           snapshot               unmask                 
condreload             disable                halt                   isolate                list-sockets           reboot                 restart                start                  unset-environment      
condrestart            edit                   help                   is-system-running      list-timers            reenable               set-default            status                 
condstop               emergency              hibernate              kexec                  list-unit-files        reload                 set-environment        stop                   
[huangcihui:/home/huangcihui] systemctl 

  那麼,自己開發的程式,能不能實現Tab自動補全? 答案是肯定的,藉助bash的complete命令即可。

假設我們新寫了一個命令叫tel,我們想讓它實現telnet的被全主機名功能,用這個命令即可:complete -A hostname tel 效果如下:

[huangcihui:/home/huangcihui] complete -A hostname tel
[huangcihui:/home/huangcihui] #tel l<Tab>
[huangcihui:/home/huangcihui] tel localhost

  而像systemctl這種補全子命令的功能,要怎麼做呢? 下麵我演示一下怎麼讓git命令實現子命令補全功能

[huangcihui:/home/huangcihui] complete -W "add checkout clone commit diff pull push status" git
[huangcihui:/home/huangcihui] #git <Tab>
[huangcihui:/home/huangcihui] git 
add       checkout  clone     commit    diff      pull      push      status    
[huangcihui:/home/huangcihui] git 

  complete還有更多複雜的用法,有興趣可以參考這篇文章

https://blog.csdn.net/koprvhdix/article/details/81036240
Linux Shell 命令自動補全(各方資料彙總補全版) Clockworkai

  下麵是我使用complete命令幫我自定義的dockerq命令進行自動補全的函數

# 新建一個命令dockerq 用於快速操作docker
__dockerq()
{
        COMPREPLY=() # 清空候選列表
        local cur=${COMP_WORDS[COMP_CWORD]}; # 用戶輸入單詞賦值給cur
        local cmd=${COMP_WORDS[COMP_CWORD-1]}; # 用戶正在操作的命令或者子命令
    case $cmd in
    'dockerq')
                # 獲取docker所有命令
                # local cmdlist=$(docker --help|awk '{if ($1 == "Commands:") { v_showFlag = 1; next; } else if ($1 == "") v_showFlag = 0; if (v_showFlag) print $1;}')

                cmdlist="images pull start run"
                # 獲取以cul開頭的所有命令
                local wordlist="$(compgen -W "${cmdlist}" -- $cur)"
                
                # 給候選列表賦值
                COMPREPLY=( ${wordlist} ) ;;
    'images')
                #使用docker images獲取所有鏡像名稱
                local cmdlist=$(docker images|awk '{if (NR != 1) print $1;}')

                # 獲取以cul開頭的所有命令
                local wordlist="$(compgen -W "${cmdlist}" -- $cur)"
                
                # 給候選列表賦值
                COMPREPLY=( ${wordlist} ) ;;

    'run')
                #使用docker ps獲取所有容器名稱
                local cmdlist=$(docker ps -a|awk '{if (NR != 1) print $NF;}')

                # 獲取以cul開頭的所有命令
                local wordlist="$(compgen -W "${cmdlist}" -- $cur)"
                
                # 給候選列表賦值
                COMPREPLY=( ${wordlist} ) ;;
    '*')
                ;;
    esac
    if [[ "${COMP_WORDS[1]}" == "read" && ${COMP_CWORD} -eq 2 ]]; then
                local pro=($(pwd))
                cd /data
                compopt -o nospace
                COMPREPLY=($(compgen -d -f -- $cur))
                cd $pro
                fi
    return 0
}
complete -F  __dockerq dockerq
alias dockerq=docker

  使用dockerq命令時,按Tab鍵可以自動補齊docker鏡像或者容器的名稱,非常方便

[root@localhost ~]# dockerq 
images  pull    run     start   
[root@localhost ~]# dockerq run 
adoring_wozniak      charming_ptolemy     composetest_web_1    determined_hodgkin   exciting_cartwright  hardcore_mestorf     hungry_mclean        mystifying_cohen     nginx001             thirsty_franklin     
alptest1             composetest_redis_1  cpu_set_demo         example1             exp1                 heuristic_cannon     magical_cartwright   nginx                phpfpm               thirsty_merkle       
[root@localhost ~]# dockerq run ^C
[root@localhost ~]# dockerq images 
abh1nav/dockerui                        composetest_web                         feisky/nginx                            mysql                                   redis
alpine                                  docker/compose                          feisky/php-fpm                          nginx                                   todoapp
busybox                                 dockerinpractice/dockerfile-from-image  hello-world                             node                                    ubuntu
centurylink/dockerfile-from-image       dockerinpractice/docker-image-graph     lukapeschke/dfa                         python                                  wordpress
[root@localhost ~]# dockerq images 

   希望這篇文章對你有幫助。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 簡單的介紹一下集合,通俗來講就是用來保管多個數據的方案。比如說我們是一個公司的倉庫管理,公司有一堆貨物需要管理,有同類的,有不同類的,總而言之就是很多、很亂。我們對照集合的概念對倉庫進行管理的話,那麼 數組就是將一堆貨整整齊齊的碼在倉庫的某個地方,普通列表也是如此;Set就是在倉庫里有這麼一個貨架, ...
  • 前言 nuget 是 .net 的常用包管理器,目前已經內置到 Visual Studio 2012 以後的版本。大多數 .net 包都托管在 nuget.org,包括 .net core 框架基礎包,得益於 .net core 的模塊化設計,很多非核心包都可以進行一定程度的獨立升級。 製作並上傳 ...
  • 前言:由於公司占時沒有運維,出於微服務的需要,Apollo只能先裝在windows 阿裡雲上跑起來,由於環境及網路等問題,在安裝過程中遇到很多坑,算是一個個坑填完後,最終實現。 一. java jdk環境 java jdk 1.8下載地址: https://www.oracle.com/java/t ...
  • 本文只對api介面,header請求參數進行簡單驗證,起到拋磚引玉使用,需要深入驗證,請自行擴展 項目目錄結構如圖 中間件類 using ApiMiddleware.Common.DataEnityModel; using ApiMiddleware.Common.DbContext; using ...
  • 一、引言 按照專用隊列解釋: MachineName\Private$\QueueName,只針對於本機的程式才可以調用的隊列,有些情況下為了安全起見定義為私有隊列。所以剛開始的時候認為,要想訪問遠程消息隊列,只能使用公共隊列。但是後來發現,公共隊列依賴Domain Controller(域控),在 ...
  • 一、打開CMD方式 點擊開始,找到windows系統展開,選擇命令提示符 win鍵+R鍵,在打開的彈框中輸入cmd,點擊確認 選中文件夾,按住shift鍵,點擊滑鼠右鍵,選擇在此處打開Powershell視窗 在資源管理器的地址欄上輸入cmd或者在地址前面加上cmd,按回車鍵 二、常用的DOS命令 ...
  • 段、頁結合:程式員希望用段,物理記憶體希望用頁,所以、、、 從虛擬記憶體中割出一個區域來給這個段,段就有了映射,但是這個虛擬記憶體不能正真的使用,需要把虛擬記憶體再映射一次,這個時候虛擬記憶體中的段分割成固定大小的頁,每一頁再去映射到物理記憶體中 1. 段、頁同時存在 段面向用戶,頁面向硬體 2. 段頁同時存在 ...
  • 1.下載CentOS CentOS下載地址: "https://wiki.centos.org/Download" 這裡選擇本地安裝包,網路安裝包在安裝時需要線上下載資源比較慢 2.安裝VirtualBox VirtualBox是Oracle旗下免費的輕量級虛擬機 VirtualBox下載地址: " ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...