3

我经常写这样的东西:

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>

我可以使用别名在

我还希望使用tabkey 适当完成以正常工作。我如何编程的完成来实现这一点?

4

2 回答 2

4

没有别名。

do_something () {
  cp -r folder-"$1" ~/temp
}
于 2013-07-03T08:15:56.550 回答
1

正如 Ignacio Vazquez-Abrams 已经提到的,不要使用别名。事实上,它甚至写在参考手册的别名部分

对于几乎所有目的,shell 函数都比别名更受欢迎。

所以你需要这个功能:

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

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

  • -n以免覆盖现有文件/文件夹
  • -v以至于冗长
  • 以下目录-t为目标目录

(我喜欢这样写我cp的 s,你的版本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选项。我不会为你做这件事(这超出了这个答案的范围),不过这并不难。然后确保您也相应地更改完成功能!其乐无穷。

于 2013-07-03T09:12:08.183 回答