Shell 使用source命令启动外部脚本
通过阅读优秀的教程和脚本,我一直在学习shell脚本 我正在读那个脚本(),我突然想到了以下几行:Shell 使用source命令启动外部脚本,shell,Shell,通过阅读优秀的教程和脚本,我一直在学习shell脚本 我正在读那个脚本(),我突然想到了以下几行: if [ -L $0 ] then source `readlink -e $0 | sed "s:[^/]*$:config:"` else source `echo $0 | sed "s:[^/]*$:config:"` fi 因此,这些行在同一个shell中启动名为“config”(所有配置值都存储在这里)的脚本。但是,为什么不直接启动文件(使用类似于“source co
if [ -L $0 ]
then
source `readlink -e $0 | sed "s:[^/]*$:config:"`
else
source `echo $0 | sed "s:[^/]*$:config:"`
fi
因此,这些行在同一个shell中启动名为“config”(所有配置值都存储在这里)的脚本。但是,为什么不直接启动文件(使用类似于“source config”的东西),该脚本的作者读取原始脚本的名称(无论它是否是链接),并将结果发送给sed以将该名称替换为“config”
感谢您的解释。此代码源于脚本实路径的同一路径中包含的文件
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
提供源代码。您的问题有两个部分:
该脚本的作者读取原始脚本的名称
这本质上是作者选择的一种方式,以确保配置文件的名称为config
。简单。脚本确保,无论提供的文件路径如何,都使用名为config
的文件
此外,您似乎对
source
感到困惑source
将在与当前shell相同的上下文中执行该文件。它只是尝试通过将调用脚本的文件名(以$0为单位)替换为config来获取调用脚本所在的实际目录
如果使用链接(-L$0)调用调用脚本,它还将尝试读取链接的值以及实际文件的值
或者,您可以这样阅读脚本:
if [ -L "$0" ]
then
ME=`readlink -e "$0"`
else
ME=`$0`
fi
MYDIR=`dirname "$ME"`
CONFIG=$MYDIR/config
source "$CONFIG"