使用“make install”来获取 bash_completion

发布于 2024-10-16 15:03:21 字数 607 浏览 3 评论 0原文

这是我的 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 目录后,我想获取 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

This is the install part of my 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

Where "stage2" is the name of my executable.

The last line is what provides the issue. After adding a file into bash_completion.d directory I want to source the bash_completion. But calling source or . yields:

. /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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

时常饿 2024-10-23 15:03:21

我看到两个问题:

  1. Makefile 规则中使用 sudo 是一个坏主意。避免这种情况,并改为调用 sudo make install 。
  2. 为什么要在非交互式 shell 中获取 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 规则部分和

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

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

I see two issues:

  1. Using sudo in a Makefile rule is a bad idea. Avoid that, and call sudo make install instead.
  2. Why would you want to source the bash_completion file in the non-interactive shell which is the make rule? It makes no sense.

As to solving them:

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

for the make rule part and

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

for the actual running of that command. You will want to document the latter in a README, or in a line which the install: target prints when finished.

妄司 2024-10-23 15:03:21

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

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

SHELL=/bin/bash

在 makefile 的顶部添加一行

Make uses /bin/sh by default. you have to force it to use bash since [[ is not supported by normal sh.

gnu make lets you set SHELL variable [in the makefile] to force it to use bash. So you would need to add a line

SHELL=/bin/bash

at the top of your makefile

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文