这是我的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
答案 0 :(得分:3)
我看到两个问题:
sudo
规则中使用Makefile
是一个坏主意。避免这种情况,而是拨打sudo make install
。bash_completion
文件?这毫无意义。至于解决它们:
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的顶部