`~/.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 可能是重要的部分?)
我有一个 .profile
,它在 运行ning common-debian.sh
这很重要,因为在容器映像构建期间 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 可能是重要的部分?)