나는 나만의 완전한 명령을 작성하려고합니다. 완료하려면 키 입력 명령의 일부를 사용하여 경로 검색을 수행해야 합니다.
나는 다음과 같은 행동을 취하려고 노력하고 있습니다
my_ws/tests 아래에 폴더 목록을 작성 하면 my_commad -ws my_ws -t[TAB]
완성된 목록으로 표시되는데 어떻게 분리해야 할지 모르겠습니다.
다음을 시도했지만 견적 문제로 인해 실패한 것 같습니다.
complete my_command 'n@-t@`echo $COMMAND_LINE | perl -ne '/-ws (\w+)/; print $1'`@'
답변1
인용 문제
언급했듯이 명령의 문제점은 작은 따옴표 안에 작은 따옴표가 있어서 이스케이프해야 한다는 것입니다. 이를 수행하는 방법에는 여러 가지가 있습니다.
backslash_quote
쉘 변수가 설정된 경우 백슬래시를 사용하여 내부 작은따옴표를 이스케이프할 수 있습니다.
complete my_command 'n@-t@`echo $COMMAND_LINE | perl -ne \'/-ws (\w+)/; print $1\'`@'
- 를 실행하여 1인지 확인할 수 있습니다
echo $?backslash_quote
. - 설정되어 있지 않은 경우 다음을 실행하여 설정할 수 있습니다.
set backslash_quote
또는 backslash_quote
설정되지 않았고 이를 변경하고 싶지 않은 경우 내부 작은따옴표를 로 바꿀 수 있습니다 '"'"'
.
complete my_command 'n@-t@`echo $COMMAND_LINE | perl -ne '"'"'/-ws (\w+)/; print $1'"'"'`@'
두 솔루션 모두 견적 문제를 해결하며, 그 결과 다음 매개변수가 -t
귀하의 매개변수에 의해 완성됩니다 -ws
.
$ my_command -ws my_ws -t TABmy_ws
어쨌든 이것은 당신이 달성하고 싶은 것이 아닙니다. 당신은 그것이 구성되기를 원합니다"my_ws/tests 아래의 폴더 목록".
실제 요구 사항에 응답
$COMMAND_LINE
보다 복잡한 완료를 위해 변수를 구문 분석하고 다른 작업을 수행하는 래퍼 스크립트를 만드는 것을 고려할 수 있습니다 .
-t
예를 들어 $WS/tests 아래의 하위 디렉터리가 다음 매개 변수를 완료하도록 하려면 홈 디렉터리에 다음과 유사한 스크립트를 작성할 수 있습니다.
$ cat $HOME/findtest.sh
#!/bin/sh
ws=$(perl -ne '/-ws (\S+)/; print $1' <<< $@)
find $ws/tests -mindepth 1 -maxdepth 1 -type d 2>/dev/null
그런 다음 명령에서 변수를 인수로 사용하여 스크립트를 호출 complete
합니다 .findtest.sh
$COMMAND_LINE
complete my_command 'n@-t@`$HOME/findtest.sh $COMMAND_LINE`@'
결과:
my_ws/tests
아래에 다음 폴더가 있다고 가정합니다 .
ls -1 my_ws/tests
test1
test2
test3
그런 다음 매개변수를 완성하려고 하면 다음과 같은 -t
결과가 발생합니다.
$ my_command -ws my_ws -tTAB my_ws/테스트/테스트1 my_ws/테스트/테스트2 my_ws/테스트/테스트3 $ my_command -ws my_ws -t my_ws/test/test
전체 경로를 표시하지 않고 my_ws/tests
선행 경로 없이 아래 디렉터리만 표시하려는 경우 find
스크립트의 명령을 다음과 같이 변경할 수 있습니다.
find $ws/tests -mindepth 1 -maxdepth 1 -type d -printf "%f\n" 2>/dev/null
결과:
$ my_command -ws my_ws -tTAB 테스트 1 테스트 2 테스트 3 $ my_command -ws my_ws -t 테스트
다른 제안
다른 기능을 추가하여 완성할 수 있습니다. 예를 들어:
complete my_command 'n@-t@`$HOME/findtest.sh $COMMAND_LINE`@' 'N/-ws/(-t)/' 'n/-ws/d/' 'p/*/(-ws)/'
또는 더 읽기 쉽게 하려면:
complete my_command \
'n@-t@`$HOME/findtest.sh $COMMAND_LINE`@' \
'N/-ws/(-t)/' \
'n/-ws/d/' \
'p/*/(-ws)/'
설명하다:
'p/*/(-ws)/'
- 당신 이후 어디에서나my_command
완료를 시도합니다-ws
.'n/-ws/d/'
- 그 후에-ws
는 디렉토리만 완성하려고 시도합니다.'N/-ws/(-t)/'
-ws
- 예상되는 다음 인수는 줄의 현재 위치 앞의 두 단어가-t
.
명령에 단어가 나타나는 순서에 tcsh
따라 완성이 시도되므로 여기서 순서가 중요합니다 . 예를 들어, 시작 부분 complete
으로 이동하면 항상 줄의 나머지 부분을 완료하려고 시도하지 않고 끝까지 완료하려고 시도합니다.'p/*/(-ws)/'
-ws
결과:
$ my_command TAB #이 완료됩니다-ws $ my_command-ws $ my_command -ws m TAB # 다음으로 시작하는 디렉토리 목록을 완성합니다.쌀 $ my_command -ws my_ws/ $ my_command -ws my_ws/ TAB # 완료됩니다.-티 $ my_command -ws my_ws/ -t $ my_command -ws my_ws/ -t TAB # 다음 폴더 목록을 완성합니다.my_ws/테스트 테스트 1 테스트 2 테스트 3 $ my_command -ws my_ws/ -t 테스트