$ 0在Redhat和Ubuntu上给出了不同的结果?

时间:2016-09-14 10:05:21

标签: linux bash ubuntu redhat

我有一些自称为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

问题:

  1. 知道为什么会这样吗?
  2. 当我更改我的脚本以使用硬编码readlink -f bash时,整个过程都有效。是否有“更好”的方法来解决这个问题?
  3. 随意解释readlink -f bash实际上在做什么; - )

1 个答案:

答案 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