`~/.profile` 中声明的函数没有加载到集成终端 shell 中时遇到问题

Having trouble with declared functions in `~/.profile` not being loaded in integrated terminal shells

我有一个 .profile,它在 运行ning common-debian.sh

之前的容器构建期间被复制到 /home/vscode

这很重要,因为在容器映像构建期间 common-delian.sh 将跳过创建默认 .profile 如果文件已经存在

在该配置文件中,我有许多 bash 函数和一些导出变量。

其中一个变量依赖于执行其中一个声明的函数,在我的 shell 中,我可以看到设置了正确的变量和值。

在 vscode 中打开新的集成终端时会出现此问题。 “新终端”命令

不过,我的 none 函数可以在 shell 中执行。 通过 typeset -F

确认

我可以 运行 source ~/.profile 然后这些功能在 shell.

中可用

有没有什么地方可以打开日志记录以确定这里发生了什么?

有关安装的详细信息

vscode主机安装是MacM1

VERSION='0.202.6'
CONTENTS_URL='https://github.com/microsoft/vscode-dev-containers/tree/main/containers/debian/history/0.202.6.md'
DEFINITION_ID='debian'
VARIANT='bullseye'
GIT_REPOSITORY='https://github.com/microsoft/vscode-dev-containers/'
GIT_REPOSITORY_RELEASE='v0.224.0'
BUILD_TIMESTAMP='Fri, 25 Feb 2022 10:48:36 GMT'

示例函数声明

kconfig() {
 ls $HOME/.kube/configs/* | tr '\n' ':'
}
declare -f kconfig

示例变量使用

export KUBECONFIG="$(kconfig)"

我可以在采购 .profile 之前确认,此变量已设置且有效,应该只来自 .profile 声明。

主文件夹供参考

vscode ➜ /workspace (master ✗) $ ls -al ~
total 76
drwxr-xr-x  1 vscode vscode  4096 Apr 27 18:59 .
drwxr-xr-x  1 root   root    4096 Feb 25 10:55 ..
drwxr-xr-x  1    501 dialout  160 Mar  8 22:31 .aws
-rw-r--r--  1 vscode vscode   220 Aug  4  2021 .bash_logout
-rw-r--r--  1 vscode vscode  4665 Feb 25 10:55 .bashrc
drwxr-xr-x  3 vscode vscode  4096 Apr 27 18:59 .cache
drwxr-xr-x  1    501 dialout  192 Apr 25 21:41 .config
drwxr-xr-x  1    501 dialout  160 Apr 27 14:20 .creds
-rw-r--r--  1 vscode vscode   500 Apr 27 18:59 .gitconfig
drwx------  2 vscode vscode  4096 Apr 27 18:59 .gnupg
drwxr-xr-x  1    501 dialout  160 Mar  9 21:59 .kube
drwxr-xr-x 12 vscode vscode  4096 Feb 25 10:55 .oh-my-zsh
-rw-r--r--  1 vscode vscode  2381 Apr 27 19:19 .profile
drwxr-xr-x  1 vscode root    4096 Apr 27 18:59 .vscode-server
drwxr-xr-x  3 vscode root    4096 Apr 27 18:26 .vscode-server-insiders
-rw-r--r--  1 vscode vscode  3897 Feb 25 10:55 .zshrc

编辑如下:


现在我将此文件复制为 ~/.bash_profile 还有一个 .profile,vscode common-debian.sh 如果在构建容器映像时文件不存在,则创建它。

vscode ➜ /workspace (master ✗) $ ls -al ~
total 80
drwxr-xr-x  1 vscode vscode  4096 Apr 27 20:08 .
drwxr-xr-x  1 root   root    4096 Feb 25 10:55 ..
drwxr-xr-x  1    501 dialout  160 Mar  8 22:31 .aws
-rw-r--r--  1 vscode vscode   220 Aug  4  2021 .bash_logout
-rw-r--r--  1 vscode vscode  2671 Apr 27 19:57 .bash_profile
-rw-r--r--  1 vscode vscode  4665 Feb 25 10:55 .bashrc
drwxr-xr-x  3 vscode vscode  4096 Apr 27 20:08 .cache
drwxr-xr-x  1    501 dialout  192 Apr 25 21:41 .config
drwxr-xr-x  1    501 dialout  160 Apr 27 14:20 .creds
-rw-r--r--  1 vscode vscode   500 Apr 27 20:08 .gitconfig
drwx------  2 vscode vscode  4096 Apr 27 20:08 .gnupg
drwxr-xr-x  1    501 dialout  160 Mar  9 21:59 .kube
drwxr-xr-x 12 vscode vscode  4096 Feb 25 10:55 .oh-my-zsh
-rw-r--r--  1 vscode vscode   807 Aug  4  2021 .profile
drwxr-xr-x  1 vscode root    4096 Apr 27 20:08 .vscode-server
drwxr-xr-x  3 vscode root    4096 Apr 27 20:07 .vscode-server-insiders
-rw-r--r--  1 vscode vscode  3897 Feb 25 10:55 .zshrc

还将以下内容添加到 /etc/profile.d/

# This file is intended to be copied into /etc/profile.d
project_profile="$HOME/.bash_profile"
if [ -r $project_profile ]; then
  source $project_profile
else
  echo "File not found or not readable: $project_profile"
fi

none 其中对生成的新 shell 有影响 也许忽略 vscode docker exec -it {container} /bin/bash 还是一样的结果。

我还尝试创建一个空的终端配置文件,其中包含一个空的 shell 配置文件,从该终端 window 启动 vscode。 认为可能是继承的 env 引起了问题。

同时设置以下用户设置 "terminal.integrated.inheritEnv": false,

来自 bash 的手册页(在 INVOCATION 部分):

When bash is started non-interactively, to run a shell script, for example, it looks for the variable BASH_ENV in the environment, expands its value if it appears there, and uses the expanded value as the name of a file to read and execute. Bash behaves as if the following com‐ mand were executed:

if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi

but the value of the PATH variable is not used to search for the file‐ name.

在您的用例中,即 shell 脚本,未读取任何启动文件。但是您可以通过将 BASH_ENV 的值设置为要在启动时读取的文件来更改它。或者,您的脚本在运行时可以获取您喜欢的任何内容,例如source .profile.

摘自答案评论:

发帖人指出,问题已在 vscode:

中解决
"terminal.integrated.defaultProfile.linux": "bash",
"terminal.integrated.profiles.linux": {
  "bash": {
    "path": "/bin/bash",
    "icon": "terminal-bash",
    "args": [ "-l" ]
  },
}

(使它成为登录名的 -l 参数 shell 可能是重要的部分?)