这是我第一次用bash编程做点什么。作为第一个例子,我试图从我的.bashrc
中获取.bash_profile
- 即使~/.bashrc
是符号链接。
的.bash_profile :
if [ -f ~/.bashrc ] && ! [ -L ~/.bashrc ]
then
# ~/.bashrc is a regular file. Source it!
source ~/.bashrc
echo "~/.bashrc found."
elif [ -L ~/.bashrc ]
then
# ~/.bashrc is a symbolic link.
# Recursivly follow symbolic links.
location="~/.bashrc"
while [ -L $location ]
do
# QUESTION: Control-Flow never reaches this point.
# Follow link on macOS.
location="$(readlink $path)"
done
# Check if final target is regular file. Source it!
if [ -f $location ]
then
source $location
echo "Symlink to .bashrc found."
fi
else
echo "No valid .bashrc found."
fi
这就是我期望我的代码所做的事情:
~/.bashrc
不是符号链接,而是常规文件:来源。 ~/.bashrc
是符号链接:
作为测试,我为原始文件~/.bashrc
创建了一个符号链接.dotfiles/.bashrc
。我的代码按预期进入elif
,但遗憾的是从未进入while
- 循环体(正如我所料,因为~/.bashrc
是一个符号链接)。
这里发生了什么?我认为location
的变量赋值在某种程度上是错误的。
答案 0 :(得分:1)
替换:
location="$(readlink $path)"
使用:
location="$(readlink $location)"
注意:
从未定义变量path
。我相信您打算将readlink
应用于location
而不是
如果你有GNU readlink
(可在Linux,自制软件等上使用),那么可以使用选项-f
,无需循环。
通常,shell变量应该在双引号内引用,除非有人希望shell应用分词,代码扩展和路径名扩展到变量的值。
例如,在以下行中,我们需要代码扩展。因此,~/
必须在引号之外:
location=~/.bashrc
完成此操作后,引用location
的脚本部分应为双引号。举个例子:
location="$(readlink "$location")"
这变得非常重要,例如,如果文件或路径名称包含空格。
答案 1 :(得分:1)
这会导致问题:
location="~/.bashrc"
波浪线扩展不会出现在双引号中,并且不会发生在
中[ -L $location ]
或者
因此,请勿在作业中使用双引号,或使用
location="$HOME/.bashrc"
或类似。