zsh: _files에서 반환된 완성 목록의 심볼릭 링크를 무시합니다.

zsh: _files에서 반환된 완성 목록의 심볼릭 링크를 무시합니다.

저는 zsh 완성을 처음 작성했습니다. 반환된 완성에 표시된 심볼릭 링크를 무시하는 방법은 무엇입니까 _files -W /path/to/folder/?

답변1

테스트 디렉터리를 채웁니다.

% cd && mkdir foo && cd foo
% touch file1 file2
% mkdir dir1
% ln -s file1 link1
% ln -s dir1 link2

비기호 링크 전역 한정자에 대해서는 ^ @기호 링크가 무시될 수 있습니다 .

% print *
dir1 file1 file2 link1 link2
% print *(^@)
dir1 file1 file2

그런 다음 사용된 플래그를 사용하여 완료를 수행할 수 -g있으며 많은 ZSH 완료 함수와 내장 기능은 이러한 간접 참조를 추적해야 합니다._path_files_files

-g 패턴은 패턴과 일치하는 파일만 완료하도록 지정합니다.

어쩌면:

#compdef foo
_arguments "1:file:_files -W ~/foo -g '*(^@)'" && return 0

그러나 이는 디렉토리를 가리키는 심볼릭 링크에서 수행됩니다.

% foo <<MASHTABKEY>>
dir1/   file1   file2   link2@

% ln -s /etc/passwd
% ln -s /etc
% foo <<MASHTABKEY>>
dir1/   etc@    file1   file2   link2@

~/foo디렉토리를 가리키는 심볼릭 링크에 문제가 있는 경우 디렉토리의 모든 파일에 대해 다른 공격을 수행해야 합니다.

#compdef foo
_arguments '1:file:_files -W ~/foo' && return 0

그런 다음 all-files완성 스타일을 지정합니다 foo.

% zstyle ':completion:*:*:foo:*:*' file-patterns '*(^@):all-files'
% foo <<MASHTABKEY>>
dir/ file1 file2

관련 정보