Makefile 관용구는 사용 가능한 첫 번째 디렉토리에 설치됩니다.

Makefile 관용구는 사용 가능한 첫 번째 디렉토리에 설치됩니다.

나는파일 생성그 중에서도Bash 완료 스크립트 설치:

install [...] /etc/bash_completion.d/

이것은 Ubuntu에서는 잘 작동하지만 Arch Bash에서는 완성 기능이 /usr/share/bash-completion/completions.

그것은 무엇입니까?일반적인 GNU 또는 POSIX make방식이걸 처리하려고? 다음과 같은 기능을 갖춘 좋은 솔루션을 원합니다.

  1. 명령이 실패 하면 install대상도 실패해야 합니다.
  2. 작성된 순서대로 디렉토리 목록을 탐색합니다. 첫 번째 기존 디렉터리(있는 경우):
    1. 파일이 없으면 설치하세요.
    2. 파일이 존재하고 최신이 아닌 경우( make의미론에 따라) 파일을 덮어씁니다.
    3. 파일이 존재하고 최신인 경우 파일을 건너뛰고
    4. 디렉터리 처리를 중지합니다.
  3. 이것은아니요파일이 어디에도 설치되어 있지 않으면 오류가 나타납니다.
  4. 이것은아니요Makefile파일이 이미 한 디렉터리에 설치되어 있고 후속 실행에서 해당 파일을 다른 디렉터리에 설치하는 경우 오류가 발생합니다(이 경우에도 처리를 시도해서는 안 됩니다). 즉, 디렉토리 목록이 주어지면 /a /b누군가

    1. 만들다 /b,
    2. 파일을 에 넣고 /b,
    3. 그런 다음 생성 /a하고
    4. 달리다make

    Makefile~해야 한다아니요/b모든 존재가 감지되었습니다.

  5. 이것은아니요디렉터리가 없으면 오류가 발생합니다.
  6. 어떤 디렉토리를 시도했는지에 대한 피드백이 있으면 좋지만 필수는 아닙니다.

답변1

확실한 스크립트 솔루션은 다음과 같습니다.

for dir in /etc/bash_completion.d /usr/share/bash-completion/completions; \
do \
    if [ -d "$$dir" ]; \
    then \
        install [...] "$$dir" || exit 1; \
        break; \
    fi; \
done

그러나 이는 좋지 않습니다.

  • 많은 이스케이프 문자
  • || exit 1오류를 확인하려면 못생긴 도구를 사용해야 함

그리고 파일이 최신인지 확인하지 않습니다(포인트 2.2, 2.3).

답변2

간단한 방법은 각 설치를 차례로 시도하고 그 중 하나가 성공할 때까지 계속하는 것입니다.

for d in /etc/bash_completion.d /usr/share/bash-completion/completions; do \
  { cmp -s $(COMPLETION_SCRIPT) $$d/$(COMPLETION_SCRIPT) || \
    install $(INSTALL_OPTIONS) $(COMPLETION_SCRIPT) $$d; } && exit; \
done; \
exit 1

관련 정보