我试图通过复制在我的
/etc/profile.d
中运行脚本的/etc/profile
的片段来复制profile.d
的功能,并让它在~/.profile
下运行脚本。这是我的~/.profile.d
。
~/.profile
这是该错误中提到的
# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package.
# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
#umask 022
# if running bash
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/.local/bin" ] ; then
PATH="$HOME/.local/bin:$PATH"
fi
## Begin user section:
## Add $HOME/.profile.d
if [ -d "$HOME/.profile.d" ]; then
for i in '$HOME/.profile.d/*.sh'; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi
:
golang.sh
我还将
GOPATH=$(go env GOPATH)
export PATH=$GOPATH/bin:$PATH
unset GOPATH
中的第 33-35 行复制到名为
~/.profile
的单独脚本中,并将其作为 test.sh
运行以确认这些行符合我的预期:i="$HOME/.profile.d/golang.sh
确实如此。我真的很困惑。我的理解是我从
if [ -r $i ]; then
echo "Can read ${i}" # Prior line is checking if the script file can be read, so if it does echo it here.
. $i # this is what it originally did, sourcing the scripts inside a for loop.
fi
复制的部分迭代给定路径中的每个文件(原始版本中的
/etc/profile
,我的版本中的 /etc/profile.d
),并检查是否可以读取它们,然后获取它们(这是不同的)正常运行它们)如果可以的话。我已经按照 $HOME/.profile.d
标签的建议通过 ShellCheck 运行此脚本,并且它说在 for 语句中使用单引号,因为双引号会破坏这些。这修复了登录 Cinnamon 时的错误,但它仍然没有像我期望的那样在
bash
中获取脚本。正如您可能已经了解到的,我是一个 shell 脚本新手。
我应该注意
~/.profile.d
尚未可执行。我认为没有必要,因为它是被获取而不是执行的,并且
golang.sh
脚本也没有 /etc/profile.d
设置。另外,做 +x
或 . $HOME/.profile.d/golang.sh
仍然会像我期望的那样设定我的道路。source $HOME/.profile.d/golang.sh
产生
for i in '$HOME/.profile.d/*.sh'; do
> echo "$i"
> done
因为你有单引号,所以它没有扩展。 删除单引号。