尝试查找脚本本身的目录时发生 Bash 脚本错误:意外的文件结尾

尝试查找脚本本身的目录时发生 Bash 脚本错误:意外的文件结尾

慷慨地借用这个StackOverflow 答案,我想找到脚本正在运行的目录,以便我可以在登录时加载它的相对路径:

该脚本现在非常小:

SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ] ; do SOURCE="$(readlink "$SOURCE")"; done
DIR=$( cd -P "$( dirname "$SOURCE" )" && pwd )

但是当我登录或致电时source <this_script.sh>,我得到:

-bash: script.sh: line 4: syntax error: unexpected end of file

情侣问题:

  1. 它挂在什么上面?
  2. 解决办法是什么?

这是正在运行:

-bash-3.2$ bash --version
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.

编辑1:

尝试吉尔的解决方案:

parent="$(dirname "$SOURCE")"
echo "PARENT IS $parent"
DIR="$(cd -P "$parent" && pwd)"
echo "DIR IS $DIR"

source我在尝试或登录时收到以下信息:

Last login: Mon Mar 12 08:07:13 2012 from ....
PARENT IS .
: No such file or directory
DIR IS
: command not found
: command not found
: command not found
: command not found

答案1

您可能在最后一行的末尾缺少换行符。

答案2

我无法使用从源代码编译的 bash 3.2.25(2) 重现此行为。

3.2系列中的某处$(…)解析方式发生了变化。

呜呜。 Bash 现在根据 Posix 规则解析命令替换:解析 $() 中包含的命令以查找结束分隔符。

如果是这种情况,我不知道为什么我无法重现它,但您可能会遇到旧的、有缺陷的解析行为。尝试简化命令。

parent=$(dirname "$SOURCE")
DIR=$(cd -P "$parent" && pwd)

我认为在外部命令替换周围添加双引号可能会有所帮助。虽然当你在赋值的值部分使用双引号时,双引号不会产生什么影响,但我记得有一个 shell 版本,它有一个有问题的解析器,它会中断,foo=$(something)但可以处理foo="$(something)";很可能就是这样。

相关内容