0

我一直在通过阅读好的教程和阅读脚本来学习 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”的脚本(所有配置值都存储在其中)。但是为什么,不是直接启动文件(使用“源配置”之类的东西,而是该脚本的作者读取原始脚本的名称(无论它是否是链接)并将结果发送到 sed 以替换此名称“配置”?

谢谢你的解释。

4

3 回答 3

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"
于 2013-09-05T09:59:06.427 回答
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脚本的真实路径, with将sed "s:[^/]*$:config:"替换 last 之后的所有内容:/config

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

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

于 2013-09-05T09:57:36.347 回答
0

你的问题有两个部分:

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

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

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

于 2013-09-05T09:58:52.720 回答