命令包装和完​​成

时间:2013-07-03 08:14:18

标签: bash bash-completion

我经常写这样的东西:

cp -r folder-0.0.1 ~/temp
cp -r folder-0.2.2 ~/temp
cp -r folder-1.0.0 ~/temp

模板:<comand> <name>-<version> <path>

但相反,我想写一下:

do_something 0.0.1
do_something 0.2.2
do_something 1.0.0

模板:<alias> <version>

我可以使用别名在中轻松完成吗?

我还希望通过 tab 键正确完成正常工作。如何编程完成此任务?

2 个答案:

答案 0 :(得分:4)

Not with aliases.

do_something () {
  cp -r folder-"$1" ~/temp
}

答案 1 :(得分:1)

正如Ignacio Vazquez-Abrams已经提到的,不要使用别名。事实上,它甚至写在Aliases section of the reference manual

  

对于几乎所有目的,shell函数优先于别名。

所以你需要这个功能:

do_something() {
    [[ -n $1 ]] && cp -rnvt ~/test folder-"$1"
}

如果您不喜欢我使用其所有选项编写cp的方式,只需删除它们即可。有关信息:

  • -n以便不覆盖现有文件/文件夹
  • -v以便详细
  • -t后面的目录是目标目录

(我喜欢这样写cp,你的cp版本可能无法解决这个问题,但很可能会这样做。

还有一个检查,以确保在启动cp之前给出了一个参数。

到目前为止,没有比其他答案更好的了。关于完成,这是你可以做的:

_do_something() {
    COMPREPLY=( $(
        shopt -s nullglob extglob
        files=( folder-+([[:digit:].])/ )
        for ((i=0;i<${#files[@]};++i)); do
            files[i]=${files[i]#folder-}
            files[i]=${files[i]%/}
        done
        compgen -W "${files[*]}" -- "${COMP_WORDS[COMP_CWORD]}"
     ) )
     return 0
}

complete -F _do_something do_something

将它放在你的.bashrc中(即使它可能不是完成的最佳位置,当你更有经验时,你会调整所有这些)并享受!

从这里你需要扩展它,直到它成为一个100000行精彩的脚本。例如,我在-n中添加了cp选项(我相信这是一个很酷的安全功能)。然后,您可以向do_something函数添加选项,例如将删除此--force选项的选项-n。我不会为你做这件事(这超出了这个答案的范围),但这并不困难。然后确保您也相应地改变完成功能!这很有趣。

相关问题