【问题标题】:Set bash TAB autocomplete parameter candidates for an executable为可执行文件设置 bash TAB 自动完成参数候选
【发布时间】:2017-12-09 22:41:06
【问题描述】:

我有一个 bourne 脚本,它将可执行文件的名称作为参数,并将 jenkins 归档的可执行文件安装到可执行文件路径。

root@host:~# cat `which jinstall`
#! /bin/sh

if [ "$#" -eq 2 ]; then
    if ! [ -e "/var/lib/jenkins/jobs/$1/builds/$2/archive/$1" ]; then
        echo "$1 build $2 not found"
        exit 1
    fi

    rm /opt/user/bak/$1 2>/dev/null
    mv /opt/user/bin/$1 /opt/user/bak 2>/dev/null
    cp /var/lib/jenkins/jobs/$1/builds/$2/archive/$1 /opt/user/bin
    chown root:user /opt/user/bin/$1
    chmod 650 /opt/user/bin/$1
    ls -al /opt/user/bin/$1
else
    echo "Usage: jinstall <executable> <build_number>"
fi

我的问题是:如何为这个脚本的参数设置 bash 自动完成候选者?这是针对 BASH shell 的。

当我输入诸如“killall”之类的命令和几个字母然后按 TAB 时,bash 会使用可执行名称自动完成参数。我希望使用 /opt/user/bin 中已有的可执行文件或 /var/lib/jenkins/jobs/ 的子​​目录的名称自动完成参数

谢谢

【问题讨论】:

    标签: bash jenkins autocomplete


    【解决方案1】:

    以下 bash 脚本将启用所需的自动补全假设您的文件名不包含空格符号

    jinstall_completion() {
       COMPREPLY=(
           $(
               shopt -s nullglob;
               for x in /var/lib/jenkins/jobs/"$2"* /opt/user/bin/"$2"*
               do
                   basename "$x"
               done|sort -u
           )
       );
    }
    
    complete -o filenames -F jinstall_completion jinstall
    

    【讨论】:

    • 我将此代码放在 /etc/bash_completion.d/jinstall 中,它可以工作。 tyvm!
    • 我还将函数名称更改为 __jinstall_completion 以防止在 shell 中自动完成并添加: if [ `which jinstall|wc -l` -eq 0 ];然后返回; fi 限制非 root 用户 tyvm
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    相关资源
    最近更新 更多