获取`make install`来获取bash_completion

时间:2011-02-09 15:21:20

标签: bash autocomplete makefile

这是我的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 个答案:

答案 0 :(得分:3)

我看到两个问题:

  1. sudo规则中使用Makefile是一个坏主意。避免这种情况,而是拨打sudo make install
  2. 为什么要在作为make规则的非交互式shell中获取bash_completion文件?这毫无意义。
  3. 至于解决它们:

    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
    

    用于制作规则部分和

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

    用于该命令的实际运行。您需要在自述文件中记录后者,或者在install:目标完成后打印的行中记录。

答案 1 :(得分:2)

默认使用/bin/sh。您必须强制它使用bash,因为普通[[不支持sh

gnu make允许您在makefile中设置SHELL变量以强制它使用bash。所以你需要添加一行

SHELL=/bin/bash

位于makefile的顶部