Получение `make install` для получения вашего bash_completion - PullRequest
3 голосов
/ 09 февраля 2011

Это установочная часть моего Makefile:

install:
    for e in $(EXEC); do \
        sudo cp --remove-destination ${CURDIR}/$$e /usr/local/bin; done
    sudo cp ${CURDIR}/bin/stage2.d /etc/bash_completion.d/stage2
    . /etc/bash_completion

Где "stage2" - это имя моего исполняемого файла.

Последняя строка - то, что обеспечивает проблему. После добавления файла в каталог bash_completion.d я хочу source bash_completion. Но вызов source или . дает:

. /etc/bash_completion
/etc/bash_completion: 32: [[: not found
/etc/bash_completion: 38: [[: not found
/etc/bash_completion: 50: Bad substitution
make: *** [install] Error 2

Ответы [ 2 ]

3 голосов
/ 09 февраля 2011

Я вижу два вопроса:

  1. Использование sudo в Makefile правиле - плохая идея. Избегайте этого и звоните sudo make install.
  2. Почему вы хотите получить файл bash_completion в неинтерактивной оболочке, которая является правилом make? Это не имеет смысла.

Что касается их решения:

install:
    $(INSTALL) -m 0755 -d $(DESTDIR)$(bindir)
    $(INSTALL) -m 0755 -p $(EXEC) $(DESTDIR)$(bindir)/
    $(INSTALL) -m 0755 -d $(DESTDIR)$(sysconfdir)/bash_completion.d
    $(INSTALL) -m 0644 -p ${CURDIR}/bin/stage2.d $(DESTDIR)$(sysconfdir)/bash_completion.d/stage2

для части make rule и

sudo make install && . /etc/bash_completion.d/stage2

для фактического выполнения этой команды. Вы захотите документировать последние в файле README или в строке, которую цель install: печатает после завершения.

2 голосов
/ 09 февраля 2011

Make использует /bin/sh по умолчанию. Вы должны заставить его использовать bash, поскольку [[ не поддерживается обычным sh.

gnu make позволяет вам установить переменную SHELL [в make-файле], чтобы заставить ее использовать bash. Поэтому вам нужно добавить строку

SHELL=/bin/bash

вверху вашего make-файла

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...