我经常写这样的东西:
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>
我可以使用别名在bash中轻松完成吗?
我还希望通过 tab 键正确完成正常工作。如何编程bash完成此任务?
答案 0 :(得分:4)
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
。我不会为你做这件事(这超出了这个答案的范围),但这并不困难。然后确保您也相应地改变完成功能!这很有趣。