bash TAB 补全在 centos 8 上不起作用

bash TAB completion does not work on centos 8

我 运行 在 docker 上安装了一个 centos 8 发行版,我想 bash 使用 dnf 包管理器完成 TAB。根据其他帖子,我在 docker 容器启动后执行了以下操作:

dnf clean all && rm -r /var/cache/dnf && dnf upgrade -y && dnf update -y

然后

dnf install bash-completion sqlite -y

完成后我重新启动容器,但仍然没有 bash 完成。我还尝试通过以下方式直接获取 bash 完成文件:

source /etc/profile.d/bash_completion.sh

但没有更好的效果

你知道我做错了什么吗?

您不需要 BASH 在 Docker 容器中完成。唯一一次应该手动连接到 Linux 容器内的 shell 是为了解决容器中进程 运行ning 行为异常的原因。事实上,一些容器设计建议甚至可能建议您根本不要在基础 OS 中包含 shell!

这对您不起作用的原因是 Linux 容器的运行方式。一个Container is simply a namespaced process that is managed by the kernel installed on the Host OS. This process cannot be modified or interrupted or the container will be destroyed since the process will be sent a SIGTERM。当您尝试 source bash_completion.sh 脚本时,您正试图将新的配置参数传递给由 Docker 管理的现有命名空间进程。

如果您真的想这样做,最好的方法是根据原始 CentOS 8 基础映像创建一个新的 Docker 容器映像。然后从那里安装 bash 完成包并添加 echo 命令以将源代码行添加到用户的 .bashrc 文件。

编辑:

关于在这个答案的评论中问 OP 的附加问题,我在下面添加了附加信息。

Why should not I need bash completion in a container

您不需要 bash 完成容器的原因是因为容器不应该附加 shell。 A 只是应该是在特定配置条件下 运行ning 进程的单个实例。容器并非旨在用于创建供您连接的开发环境,它们旨在 运行 软件基础架构中的进程和应用程序。

Manually updating & installing packages

您提到启动容器时要做的第一件事就是安装包。这也让我感到震惊,因为您根本不应该手动与容器交互。这包括包安装。相反,您应该从旧的 Base Image and add additional RUN statements to the Dockerfile 生成一个新的容器镜像来更新系统并安装这些所需的包。

Cannot believe it is not possible

如果您创建一个新的 Docker 文件,并故意将其安装在基础映像的新 layer 上并生成一个新的容器映像供您使用,则有可能。但关键是你不应该首先连接到 Docker 容器,甚至到达你可能需要像 bash 完成这样的东西的地步!

这里有一个关于容器和虚拟机之间区别的重要总结,可能有助于为您阐明其中的一些内容。简而言之shell,容器应该运行,并且只有运行,进程。