慷慨地借用这个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
情侣问题:
- 它挂在什么上面?
- 解决办法是什么?
这是正在运行:
-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)"
;很可能就是这样。