Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.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
从运行bash脚本的bash脚本导入函数定义_Bash_Shell - Fatal编程技术网

从运行bash脚本的bash脚本导入函数定义

从运行bash脚本的bash脚本导入函数定义,bash,shell,Bash,Shell,我有两个脚本foo.sh和bla.sh 福什 #bin/bash test(){ "hello world" } test exit 1 布拉什 #bin/bash source ./a.sh echo a.test 问题是源代码看起来像是在运行a.sh脚本,当然,在退出1之后,永远不会执行b 有没有办法只使用bla中的函数测试而不运行整个脚本?如果您希望脚本能够在不运行其内容的情况下进行源代码开发,您应该这样设计 #!/bin/bash # put your funct

我有两个脚本foo.sh和bla.sh

福什

#bin/bash 
test(){
    "hello world"
}   
test
exit 1
布拉什

#bin/bash 
source ./a.sh
echo a.test
问题是源代码看起来像是在运行a.sh脚本,当然,在退出1之后,永远不会执行b


有没有办法只使用bla中的函数测试而不运行整个脚本?

如果您希望脚本能够在不运行其内容的情况下进行源代码开发,您应该这样设计

#!/bin/bash

# put your function definitions here
mytest() { echo "hello world"; }

# ...and choose one of the following, depending on your requirements:

# more reliable approach, *except* doesn't detect being sourced from an interactive or
# piped-in shell.
(( ${#BASH_SOURCE[@]} > 1 )) && return

# less reliable approach in general, but *does* detect being sourced from an interactive
# shell.
[[ "$BASH_SOURCE" != "$0" ]] && return

# put your actions to take when executed here
mytest
exit 1
工作原理:${BASH_SOURCE[@]}>1 如果每个堆栈帧的源文件数组在脚本根中的长度超过一个,则获得任何附加堆栈帧的唯一方法是让脚本从其他地方来源

这里需要注意的是,交互式shell或非交互式shell(其输入来自管道或其他非文件源)在BASH_源数组中没有条目,因此,如果我们来自人工驱动的shell,或者shell从管道或其他非文件源读取其输入,那么仍然只有一个条目

工作原理:[$BASH\u SOURCE!=$0]] BASH_SOURCE是一个源文件数组,每个堆栈帧一个元素;与所有bash数组一样,当扩展时没有显式索引到特定元素中,它默认为当前正在执行或源代码的第一个文件$0是正在执行的命令的名称,源命令不会更新该名称

因此,如果这些不匹配,我们知道我们是来源

重要警告:
请注意,在某些情况下,依赖$0必然会被破坏:cat input script | bash无法准确知道输入脚本来自磁盘上的位置,因此它将始终检测到这是源代码。请参阅的“为什么$0不是选项”一节,以详细了解这些限制。

您能解释一下这[[$]=$0]]]&&return的来源是什么意思吗?您不了解其中的哪些部分?你知道[[]做什么吗?&&$0? $_?很抱歉,在bash上非常新手。我只理解&&并且我甚至不确定它在这个上下文中做了什么。非常抱歉。[[$foo=$bar]]是字符串比较。[$foo=$bar]]不是,完全是-它将右侧视为一个glob表达式,而不是字符串-但是它很接近是一个短路布尔运算符,与大多数其他语言中的运算符相同:因为它是短路运算符,所以只有在左侧有真实结果时,右侧才会运行。当一个脚本被源化时,return会提前退出。不幸的是$0并不那么可靠,即使引用的bash实际上也不这么做,它没有使用绝对路径名,它使用的是您键入的任何东西来运行脚本,这仍然是匹配的,但这是巧合。旁白:.sh意味着一个脚本要被源代码化到POSIX sh脚本中,而/bin/bash-shebang表示由bash执行,而不是由POSIX-sh执行。如果您的意思是由另一个shell实例来源代码,请使用一个扩展来准确地指示支持哪个shell……然而,如果某个命令只是一个命令而不是源代码,那么它就不应该有任何扩展,就像您运行ls一样,不是小精灵,再放远一点:一定要有一个舍邦/bin/bash;bin/bash不起作用-!必须是前两个字符,否则操作系统不会承认shebang是这样的。此外,由于test是一个shell内置项,因此最好命名任何与差异重叠的内容,因此在我的示例中使用mytest。