Makefile
사용자가 입력한 다음 누를 때 셸에 전혀 나타나지 않도록 특정 대상을 표시하는 방법이 있습니까 ? 레시피가 너무 많아서 사용자가 찾기 대상을 누를 때 레시피가 모두 쉘 자동 완성에 표시되는 것을 원하지 않습니다.make
Tab
Makefile
Tab
답변1
이 문제를 연구하고 첫 번째 답변에 쓴 해결책을 생각해낸 후에 또 다른 문제가 있다는 것을 깨달았습니다.매우 간단하다방법.
표시하고 싶지 않은 대상 이름으로 시작하세요.가리키다.
예:
.PHONY: foo .hiddentarget
foo: foo.x .hiddentarget
foo.x: foo.c
touch foo.x
.hiddentarget: foo.x
echo foo.x ok, I believe
그게 당신이 필요한 전부입니다!
라는 타겟을 차단하는 방법을 고민하다가 이 아이디어를 생각해냈습니다..숨겨진 표적잘못 호출되어 모든 숨겨진 대상을 실행합니다. :)
경고하다이런 대상 이름을 사용하는 데 부작용이 있는지는 모르겠지만, 본 적은 없습니다.".대상 이름"(점으로 시작).
답변2
특정 대상을 숨기려면 셸의 자동 완성 기능을 해킹해야 합니다. bash
용도 /etc/bash_completion
및 /etc/bash_completion.d/*
목적.
tcsh가 어떻게 하는지 기억하지 마세요.
답변3
나는 이것이 밑줄로 대상을 시작함으로써 달성될 수도 있다는 것을 발견했습니다
_hiddentarget:
@echo "Running hidden target"
답변4
편집하다다른 답변을 읽는 것이 좋습니다(대상 이름은 점으로 시작함). 하지만 프로그래밍 부분이 다른 유사한 질문에 도움이 될 수 있으므로 여기서 이 질문에 대답하겠습니다.
글쎄, 해결책을 찾는 데 시간이 좀 걸렸습니다. 이것은 (좋은) 초안이며 작업이 완료되기를 바랍니다.
이 파일을 편집해야 합니다. /usr/share/bash-완성/완성/make (Debian Wheezy 또는 귀하와 유사한 것의 경우)
현재 버전에서 70~73행은 다음과 같습니다.
70 COMPREPLY=( $( compgen -W "$( make -qp $makef $makef_dir 2>/dev/null | \
71 awk -F':' '/^[a-zA-Z0-9][^$#\/\t=]*:([^=]|$)/ \
72 {split($1,A,/ /);for(i in A)print A[i]}' )" \
73 -- "$cur" ) )
그런 다음 다음 코드로 바꿉니다.
70 HIDDENGOALS="$(make -qp | grep '^\.HIDDENGOALS:' | cut -d' ' -f2- | sed 's/ /\\|/g')"
71 if [[ "$HIDDENGOALS" == "" || "$HIDDENGOALS" == ".HIDDENGOALS:" ]]; then
72 COMPREPLY=( $( compgen -W "$( make -qp $makef $makef_dir 2>/dev/null | \
73 awk -F':' '/^[a-zA-Z0-9][^$#\/\t=]*:([^=]|$)/ \
74 {split($1,A,/ /);for(i in A)print A[i]}' )" \
75 -- "$cur" ) )
76 else
77 COMPREPLY=( $( compgen -W "$( make -qp $makef $makef_dir 2>/dev/null | \
78 awk -F':' '/^[a-zA-Z0-9][^$#\/\t=]*:([^=]|$)/ \
79 {split($1,A,/ /);for(i in A)print A[i]}' \
80 | grep -ve "$HIDDENGOALS" )" \
81 -- "$cur" ) )
이제 makefile
다음을 사용할 수 있습니다특별한 목표Bash 자동 완성 대상 숨기기:
.HIDDENGOALS: somegoal anothergoal goalstohide
특별한 목표 와 매우 유사합니다 .PHONY
(약간의 차이점이 있음).
주의 깊은:
(나)이 솔루션은 를 통해 작동하므로 grep -ev
특수 대상은 정확하게는 아닙니다. 정규식의 방식과 일치하도록 라인에 있는 모든 것을 사용합니다.
copy2
따라서 하나의 목표가 있고 또 다른 목표가 있다면 다음과 같이 copy
작성하십시오.
.HIDDENGOALS: copy
두 개의 목표가 숨겨집니다!
나는 독자에게 연습으로 이 동작에 대한 해결책을 제공합니다! ;)
(둘)주목해야 할 또 다른 점은 :
가 옆에 위치하도록 하드코딩되어 있다는 것 입니다 .HIDDENGOALS:
. 이는 대상이 허용하더라도공간처럼 .PHONY :
, 이 특정 해커는 그렇지 않았습니다.
(삼)내 생각에는 로컬 파일을 편집하는 것보다/usr/share/bash-완성/완성/make, 업그레이드 중 정보 손실을 방지합니다. 그러나 나는 어떤 옵션도 테스트하지 않았습니다. 알고 계시다면 댓글을 달아 주시면 이 답변을 업데이트하겠습니다.
(4)약간의 가능성이 있습니다궁금한목표를 실행.숨겨진 표적을 사용하면 make .HIDDENGOALS
모든 숨겨진 목표를 달성할 수 있습니다. 그리고 이름을 자동 완성하는 것은 불가능합니다. 이는 또 다른 매우 간단한 대답으로 이어집니다!