인용 문제

인용 문제

나는 나만의 완전한 명령을 작성하려고합니다. 완료하려면 키 입력 명령의 일부를 사용하여 경로 검색을 수행해야 합니다.

나는 다음과 같은 행동을 취하려고 노력하고 있습니다

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 테스트

관련 정보