zsh 완료: /dev에서 블록 장치를 완료합니다.

zsh 완료: /dev에서 블록 장치를 완료합니다.

/dev내 스크립트의 경우 블록 장치를 완성해야 합니다.

my_script.sh <TAB>

그러면 목록에 있는 모든 디스크가 완료되고 제공됩니다 /dev/(하위 디렉터리에 없음). /dev예를 들어:

my_script.sh <TAB>
my_script.sh /dev/

my_script.sh /dev/<TAB>
sda sdb sdc mmcblk0p1

my_script.sh /dev/sd
sda sdb sdc 

설명된 대로 작동하도록 완성을 어떻게 수정해야 합니까?

_arguments -S : \
    '--foo' \
    '--bar' \
    '*:file:_files'

답변1

노력하다:

_arguments -S : \
    '--foo' \
    '--bar' \
    '*:block devices:(( /dev/*(-%b:t) ))'

(-%b:t)%b심볼릭 링크 확인 후 선택할 블록 장치를 선택하는 글로벌 한정자이며 -, 수정자는 해당 파일에 대한 모든 파일 :t만 선택합니다 .t

_files, 을 사용할 수 있습니다 .혜택예를 들어 색칠하기에서:

_arguments -S : \
    '--foo' \
    '--bar' \
    '*:block devices:_files -W /dev -g "*(-%b)"'

-W여기에 _files지정된 옵션을 사용하여 W이러한 파일을 찾지만, /dev그 안에서 더 많은 블록 장치를 찾을 수 있도록 하위 디렉터리도 제공합니다.

Linux에서는 다음을 사용할 수 있습니다.

    '*:block devices:_files -W /sys/class/block'

또는:

    '*:block devices:(( /sys/class/block/*(:t) ))'

이러한 블록 장치의 커널 이름만 가져옵니다.

답변2

블록 장치만 찾고 있으므로 별도의 두 단계가 필요합니다.

먼저 이러한 특수 준파일 중 /dev실제로 블록 장치가 무엇인지 확인해야 합니다. 이는 를 사용하여 수행할 수 있습니다 stat. 이 명령은 유닉스에서 매우 일반적이지만 어떤 이유로 배포판에 이 명령이 없으면 apt install coreutils.

다음 명령은 /dev에 있는 블록 장치(800으로 시작하는 장치)의 전체 이름으로 구성된 배열을 생성합니다.

blockdevs=($(stat -c "%t %n" /dev/* | grep "^8" | cut -d' ' -f2))

노트:실제 블록 장치 이상을 찾고 있다면(모든 파일 이름이 /dev블록 장치는 아닙니다. 일반 파일 및 디렉토리 외에도 및 기호 링크와 /dev/tty같은 다양한 하위 유형과 같은 "문자 특수 파일"이 있습니다 .) 위의 배열 선언을 편집합니다./dev/zero/dev/core


배열이 있으면 배열에 저장된 값을 기반으로 해당 완성을 만들 수 있습니다(따옴표는 매우 중요합니다).

compctl -g "${blockdevs}" my_script.sh

이제 명령줄이 로 시작 my script.sh하고 을 클릭 하면 완성기는 /dev/의 시작 접두사를 TAB자동으로 채웁니다 . /dev/' and then display the names of blockdevices found in the top-most level of that directory (i.e.`).

배열 값을 사용하는 이러한 접근 방식은 모든 유형의 사용자 정의 완성에 적용됩니다. 기본적으로 첫 번째 단어가 일치하는지 확인하고 myscript.sh, 두 번째 인수로 다른 입력이 감지되지 않으면 일치하고 (:t)결과에서 발견된 파일 이름(수정자 포함) 만 표시합니다./dev

터미널에서 이 두 줄의 코드를 실행하거나 둘 다 ~/.zshrc에 추가하여 완료를 유지합니다.

관련 정보