Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 使用source命令启动外部脚本_Shell - Fatal编程技术网

Shell 使用source命令启动外部脚本

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

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

我正在读那个脚本(),我突然想到了以下几行:

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"