我有一些自称为bash的专家创建了以下脚本:
SCRIPT_LOCATION="$(readlink -f $0)"
SCRIPT_DIRECTORY="$(dirname ${SCRIPT_LOCATION})"
export PYTHONPATH="${PYTHONPATH}:${SCRIPT_DIRECTORY}/util"
在我当地的Ubuntu 16.04上运行良好。现在我想在RH 7.2服务器上使用它;在那里我收到来自readlink
的错误消息;关于被错误的参数调用。
然后我想:在Ubuntu上,$ 0给出了“bash”;而在RH上,它给出了“-bash”。
编辑:脚本被调用为. ourscript.sh
问题:
readlink -f bash
时,整个过程都有效。是否有“更好”的方法来解决这个问题?答案 0 :(得分:3)
由于脚本来源,readlink -f $0
没有意义,因为它只会显示用于运行您当前使用的shell的命令。
要解释命令的区别,请查看bash手册页:
登录shell是一个参数为零的第一个字符是 - ,或者是以--login选项开头的一个。
当bash作为交互式登录shell或具有--login选项的非交互式shell调用时,它首先从文件/ etc / profile中读取并执行命令(如果该文件存在)。在读取该文件之后,它按顺序查找〜/ .bash_profile,〜/ .bash_login和〜/ .profile,并从存在且可读的第一个命令中读取并执行命令。启动shell以禁止此行为时,可以使用--noprofile选项。
所以猜测ubuntu从noprofile选项开始。
至于readlink,我们可以再次查看手册页
-f , - canonicalize 通过递归地跟随给定名称的每个组件中的每个符号链接来规范化;除了最后一个组件之外的所有组件必须存在
因此它遵循符号链接到基础。
将readlink -f与任何非限定路径一起使用将导致它只是将最后一个arg附加到当前工作目录,而这实际上并不显示脚本的运行位置。
尝试在其后添加任意随机字符串而不是bash,并且会看到脚本不受影响。
e.g
readlink -f dafsfdsf
返回
/home/me/testscript/dafsfdsf