bash – 如何完成相对于另一个目录的文件名?
这是以下讨论的后续问题:
https://bugs.launchpad.net/ubuntu/+source/bash-completion/+bug/1394920 假设我有一个带有一些文件和目录的文件夹?/ tmp: $mkdir a; touch file1.txt; mkdir a/b; mkdir a/c; touch a/d; mkdir a/b/c 我现在尝试在?/ tmp中创建一个完成脚本来完成文件名,但是如果当前目录是?/ tmp,则完整的-o filenames选项才能正常工作. 有关更多背景信息,请参阅上面的链接.这是我得到的: $cat setup _compTest() { local cur baseFolder cur="${COMP_WORDS[$COMP_CWORD]}" baseFolder=~/tmp compopt -o nospace COMPREPLY=( $( cd "$baseFolder" if [[ ${cur: -1} != "/" && -d $cur ]] ; then echo "$cur/" else compgen -f "$cur" fi ) ) } complete -F _compTest aaa 然后我来源: $. setup 然后我就可以了 $aaa <tab><tab> >问题1:在完成列表中的目录名称末尾没有添加斜杠(这样可以轻松地将目录与完成列表中的文件名分开) 解决方法
我会把这个函数写成:
_compTest () { local cur; local tmp; local tmp_escaped; local i; _get_comp_words_by_ref cur; local _compreply=() tmp=~/tmp/ tmp_escaped=${tmp/////} cur=$tmp$cur; if [ "$1" == "-d" ]; then _cd else _filedir; fi; for i in "${COMPREPLY[@]}"; do [ -d "$i" ] && [ "$i" != "$tmp." ] && [ "$i" != "$tmp.." ] && i="$i/" _compreply=("${_compreply[@]}" "$i") done COMPREPLY=(${_compreply[@]/$tmp_escaped/}) } && complete -o nospace -F _compTest aaa_files _compTestDir() { _compTest -d } && complete -o nospace -F _compTestDir aaa_directories 它有3个部分, >将$cur添加到基本目录前面 – ?/ tmp. 仅供记录:您可以使用此逻辑来完成相对于许多其他类型路径的文件名,例如 >我用它来完成perforce路径// ….>您还可以完成相对于public_html目录的http:// localhost / *路径. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |