当location ="〜/ .bashrc"

时间:2016-09-17 21:06:41

标签: bash variables .bash-profile

这是我第一次用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的变量赋值在某种程度上是错误的。

2 个答案:

答案 0 :(得分:1)

替换:

location="$(readlink $path)"

使用:

location="$(readlink $location)"

注意:

  1. 从未定义变量path。我相信您打算将readlink应用于location而不是

  2. 如果你有GNU readlink(可在Linux,自制软件等上使用),那么可以使用选项-f,无需循环。

  3. 通常,shell变量应该在双引号内引用,除非有人希望shell应用分词代码扩展路径名扩展到变量的值。

    例如,在以下行中,我们需要代码扩展。因此,~/必须在引号之外:

    location=~/.bashrc
    

    完成此操作后,引用location的脚本部分应为双引号。举个例子:

    location="$(readlink "$location")"
    

    这变得非常重要,例如,如果文件或路径名称包含空格。

答案 1 :(得分:1)

这会导致问题:

location="~/.bashrc"

波浪线扩展不会出现在双引号中,并且不会发生在

[ -L $location ]

或者

因此,请勿在作业中使用双引号,或使用

location="$HOME/.bashrc"

或类似。