如何取消设置 bash 变量 `!::=::\`?

如何取消设置 bash 变量 `!::=::\`?

当我运行时,printenv返回的变量之一是!::=::\.我注意到该变量存在,因为 docker 在设置它后无法正常工作。

$ printenv | grep ::
!::=::\

$ docker stack deploy keycloak -c keycloak.yml
unexpected environment "=::=::\\"

我在 Windows 上使用 git-bash。奇怪的是这个变量只在我使用时存在一些终端仿真器,如 ConEmu、Window 终端、Git-bash 终端,而使用 VSCode 的内置终端时它不存在。

为什么这个变量存在?我该如何删除它?

我尝试了以下方法没有成功:

$ unset !::
bash: :: unrecognized history modifier

$ unset \!::

$ unset \!\:\:

$ echo $!::
::

$ env | grep ::
!::=::\

$ printenv | grep :: | cat -A
!::=::\$

$ export !::= 
bash: :: unrecognized history modifier

$ export \!::=
bash: export: `!::=`: not a valid identifier

$ export $!::=
bash: export: `::=`: not a valid identifier

$ set +H
$ unset !::
$ unset \!::
$ env | grep ::
!::=::\

以下作品:

$ env -u \!:: env | grep::

$ env -u \!:: docker stack deploy keycloack -c keycloak.yml
Creating network keycloack_default 
...

我的环境:
操作系统:(Windows基于git-bashMSys)
Bash 版本:5.2.15(1)-release

答案1

这是我如何解决的。我创建了一个.profile文件,如果它用 标识一个变量::,它将启动一个没有该变量的新 bash。

$ cat $HOME/.profile
if env |grep -q ::
then
        exec env -u \!:: bash
fi

顺便说一下,我试图看看它是从哪里来的;该bash进程由父进程为 1 的进程创建mintty

$ ps -p $$
      PID    PPID    PGID     WINPID   TTY         UID    STIME COMMAND
     2150    2149    2150      12536  pty1     1234897 15:34:37 /usr/bin/bash

$ ps -p 2149
      PID    PPID    PGID     WINPID   TTY         UID    STIME COMMAND
     2149       1    2149       9644  ?        1234897 15:34:37 /usr/bin/mintty

这个 mintty 进程是使用以下环境变量创建的:

$ grep -z :: /proc/2149/environ
!::=::\

但是由于实际上没有 init 进程 (pid 1),我不知道这个 mintty 进程究竟是如何创建的git-bash,以及为什么它以这个环境变量启动。但无论如何,上述解决方法对我有用。

答案2

我不知道它为什么存在,但你可以使用以下命令取消设置env -u

$ env | grep ::
!::=::
$ env -u \!:: bash -c 'env | grep ::'
$

相关内容