如果在 bash 中我执行“ ”,那么在执行“ ”和“ ”等时, set -P
bash 将遵循“物理目录结构” ,而不是通过符号链接定义的“逻辑目录结构”。不幸的是,bash 仍然不遵循文件名补全的物理目录结构。我怎样才能让 bashpwd
cd ..
尊重我的权威在这个问题上?
谢谢!
|>ouglas
PS 不幸的是,同样的问题现在也困扰着 Emacs 打开文件等等。如果有人也知道如何告诉 Emacs 尊重我的物理目录结构,那么我也想知道答案。
PPS 我不知道是谁决定让一些程序尝试理解你的“逻辑目录结构”是个好主意,但事实并非如此!除非你能说服世界上每个程序都这样做,因为让一些程序使用你的物理目录结构,而让其他程序使用你的逻辑目录结构,这会引起混乱和烦恼。
答案1
感谢之前的回答。但事实上,“ set -P
”本身就可以很好地完成工作,这与我最初对这个问题的疑问相反。
当我最初尝试这个时,我一定是以某种方式让 bash 陷入混乱状态,文件名补全不遵守“ set -P
”设置。但现在有了新的 bash,一切正常。“ set -P
”似乎在整个 bash 过程中始终将 bash 置于“物理目录结构”模式。
答案2
这可能会帮助你部分实现目标。
使用type -a _expand
并将其输出与下面的函数进行比较。现有函数应与下面第一个函数之后的部分匹配。如果不匹配,您可以像这里看到的else
那样将已有的内容包装在外部。if...else
将其粘贴到 Bash 提示符下进行测试。然后,如果您满意,请将其放入文件~/.bashrc
中以覆盖函数定义/etc/bash_completion
(而不是直接编辑它)。
_expand ()
{
if [[ $- == *P* && -L "$cur" && -d "$cur" ]]; then
cd "$cur";
eval cur="$PWD";
cd - > /dev/null;
else
if [[ "$cur" == \~*/* ]]; then
eval cur=$cur;
else
if [[ "$cur" == \~* ]]; then
cur=${cur#\~};
COMPREPLY=($( compgen -P '~' -u $cur ));
[ ${#COMPREPLY[@]} -eq 1 ] && eval COMPREPLY[0]=${COMPREPLY[0]};
return ${#COMPREPLY[@]};
fi;
fi;
fi
}
这是利用了 Bash 的制表符补全的波浪号扩展功能。
现在你可以做
ls -l symdir<TAB>
你会看到
ls -l /dest/dir<CURSOR>