我一直在学习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以替换此名称“配置”?
感谢您的解释。
答案 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相同的上下文中执行该文件。