当我运行时,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-bash
MSys)
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 ::'
$