使用source命令启动外部脚本

时间:2013-09-05 09:48:04

标签: shell

我一直在学习shell脚本,通过阅读好的教程和阅读脚本。

我正在阅读那个剧本(https://github.com/Ahtenus/minecraft-init/blob/master/minecraft),这些第一行打击了我:

if [ -L $0 ]
then
    source `readlink -e $0 | sed "s:[^/]*$:config:"`
else
    source `echo $0 | sed "s:[^/]*$:config:"`
fi

因此,这些行在同一个shell中启动名为“config”的脚本(其中存储了所有配置值)。但是为什么,而不是直接启动文件(使用“source config”之类的东西,该脚本的作者读取原始脚本的名称(无论是否是链接)并将结果发送到sed以替换此名称“配置”?

感谢您的解释。

3 个答案:

答案 0 :(得分:1)

它只是通过用config替换调用脚本的文件名($ 0)来尝试获取调用脚本所在的实际目录。

如果使用链接(-L $ 0)调用调用脚本,它还会尝试读取链接的值以及实际文件。

或者你可以这样阅读脚本:

if [ -L "$0" ]
then
    ME=`readlink -e "$0"`
else
    ME=`$0`
fi

MYDIR=`dirname "$ME"`
CONFIG=$MYDIR/config

source "$CONFIG"

答案 1 :(得分:0)

此代码获取脚本实际路径的相同路径中包含的文件config

让我们解释一下代码:

if [ -L $0 ]
then
    source `readlink -e $0 | sed "s:[^/]*$:config:"`
else
    source `echo $0 | sed "s:[^/]*$:config:"`
fi

正如您在问题中所说,if [ -L $0 ]会检查脚本名称($0)是否为链接。

readlink -e $0返回链接的目标:

$ ln -s a mylink
$ ls -la
lrwxrwxrwx  1 me me    1 Sep  5 11:59 mylink -> a
$ readlink -e mylink 
/home/me/test/a

使用/home/something/script.sh sed "s:[^/]*$:config:"脚本真实路径将使用/替换config之后的所有内容:

$ echo "hjio/hi/hi" | sed "s:[^/]*$:config:"
hjio/hi/config

所以它正在做的是获取脚本相同路径中包含的文件config

答案 2 :(得分:0)

您的问题分为两部分:

  

该脚本的作者读取原始脚本的名称......

这实际上是作者选择的一种方式,以确保配置文件的名称为config。简单。该脚本确保无论提供文件的路径是什么,都使用名为config的文件。

此外,您似乎对source感到困惑。 source将在与当前shell相同的上下文中执行该文件。