2013-07-03 43 views
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>

我可以在中轻松使用别名S'

我还想适当完成标签键正常工作。我如何编程的完成来实现这个目标?

+0

关闭请求:问题也是关于编程完成! –

回答

4

Not with aliases.

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

好的,但我有一个标签+选项卡自动完成的麻烦。 当我使用标签+标签Bash写入文件夹 - so_something后。当我这样做时,它看起来像文件夹 - 。它可以修复吗? –

+0

bash write = bash建议在这种情况下写入。 –

+0

当然。修改自动完成功能。不,我不知道如何。 –

1

正如伊格纳西奥巴斯克斯 - 艾布拉姆斯已经提到,不使用别名。实际上,它甚至写在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行精彩的脚本。例如我在cp中加入-n选项(我相信这是一个很酷的安全功能)。然后,您可以将选项添加到do_something功能,例如选项--force将删除此-n选项。我不会为你做这件事(它超出了这个答案的范围),但这并不难。然后确保您也相应地更改完成功能!其乐无穷。