나는파일 생성그 중에서도Bash 완료 스크립트 설치:
install [...] /etc/bash_completion.d/
이것은 Ubuntu에서는 잘 작동하지만 Arch Bash에서는 완성 기능이 /usr/share/bash-completion/completions
.
그것은 무엇입니까?일반적인 GNU 또는 POSIX make
방식이걸 처리하려고? 다음과 같은 기능을 갖춘 좋은 솔루션을 원합니다.
- 명령이 실패 하면
install
대상도 실패해야 합니다. - 작성된 순서대로 디렉토리 목록을 탐색합니다. 첫 번째 기존 디렉터리(있는 경우):
- 파일이 없으면 설치하세요.
- 파일이 존재하고 최신이 아닌 경우(
make
의미론에 따라) 파일을 덮어씁니다. - 파일이 존재하고 최신인 경우 파일을 건너뛰고
- 디렉터리 처리를 중지합니다.
- 이것은아니요파일이 어디에도 설치되어 있지 않으면 오류가 나타납니다.
이것은아니요
Makefile
파일이 이미 한 디렉터리에 설치되어 있고 후속 실행에서 해당 파일을 다른 디렉터리에 설치하는 경우 오류가 발생합니다(이 경우에도 처리를 시도해서는 안 됩니다). 즉, 디렉토리 목록이 주어지면/a /b
누군가- 만들다
/b
, - 파일을 에 넣고
/b
, - 그런 다음 생성
/a
하고 - 달리다
make
Makefile
~해야 한다아니요/b
모든 존재가 감지되었습니다.- 만들다
- 이것은아니요디렉터리가 없으면 오류가 발생합니다.
- 어떤 디렉토리를 시도했는지에 대한 피드백이 있으면 좋지만 필수는 아닙니다.
답변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