我有三个脚本:
我的剧本内容:
script1.sh:
echo"This is script1"
source script2.sh
sh script3.sh
echo "End of script1"
script2.sh:
logger(){
echo "The calling script name is $BASH_SOURCE"
}
script3.sh:
echo "Script3 start"
logger
echo "End of script3"
当我运行sh script1.sh
时,我希望记录器功能打印
script3.sh
因为这是调用该函数的脚本。但相反,它正在打印
script2.sh
有没有办法做到这一点?
答案 0 :(得分:2)
正如我评论的那样,你的脚本甚至不会做你声称的那样:
这不大可能。你没有表现出一切。在bash中,函数不可导出,因此在script1中获取script2不会使script3中的logger可见。你必须在script3中做过一些事情。
确实,复制代码并在本地运行代码表明发生了什么:
$ ./script1.sh
++ echo 'This is script1'
This is script1
++ source script2.sh
++ sh script3.sh
+ echo Script3 start
Script3 start
+ log
script3.sh: 3: script3.sh: log: not found
+ echo End of script3
End of script3
++ echo 'End of script1'
End of script1
注意命令未找到错误,这正是我的想法。
事实上,如果你正确检查bash的手册,有一种正确的方法可以实现你想要的东西:
BASH_SOURCE
一个数组变量,其成员是源文件名,其中定义了FUNCNAME数组变量中相应的shell函数名。 shell函数 $ {FUNCNAME [$ i]}在$ {BASH_SOURCE [$ i]}文件中定义,并从$ {BASH_SOURCE [$ i + 1]}调用。
仔细阅读,它表示从${BASH_SOURCE[$i]}
定义并从${BASH_SOURCE[$i+1]}
调用的函数。在这种情况下,logger
位于${BASH_SOURCE[0]}
,来电者只需驻留在${BASH_SOURCE[1]}
。
因此,将您的script2
更改为以下工作:
$ cat script2.sh
log(){
echo "The calling script name is ${BASH_SOURCE[1]}"
}
(除了我更改了函数名称,以便它不会与我的其他shell工具发生冲突。)
演示:
$ ./script1.sh
This is script1
Script3 start
The calling script name is ./script3.sh
End of script3
End of script1
确实做了工作。