闭包获取父函数名
Closures get parent function name
Bash是“一种函数式编程语言”,它没有类。我
设法使用 Closures 的封装,但我也想做一些
反省也可以找到 docker_
parent/super/base 函数(如果你知道添加
注释以正确定义它)。
我做到了,但是用了一个肮脏的 hack super=${FUNCNAME}
。有什么解决办法
使用那种PARENT_FUNCNAME
?我有这样的文件 docker_.sh:
#!/usr/bin/env bash
function docker_ {
local super=${FUNCNAME}
function hello {
echo "INFO" "do ${super}${FUNCNAME}"
}
function install {
echo "INFO" "do ${super}${FUNCNAME}"
#sudo curl -sSL https://get.docker.com/ | sh || exit 1
}
function run {
echo "INFO" "do ${super}${FUNCNAME}"
#docker run -d -p 3306:3306 ${DOCKER_IMAGE_NAME} /docker.sh run_mysql
}
${@}
}
${@}
得到了一些结果:
$ ./docker_.sh docker_ hello
INFO do docker_hello
$ ./docker_.sh docker_ run
INFO do docker_run
$ ./docker_.sh docker_ install
INFO do docker_install
已解决
使用
${FUNCNAME[1]}
${FUNCNAME[@]:0:${#FUNCNAME[@]}-1} get all list beside main
代码:
#!/usr/bin/env bash
function docker_ {
function hello {
echo "INFO" "do ${FUNCNAME[1]} ${FUNCNAME}"
}
function install {
echo "INFO" "do > ${FUNCNAME[@]:0:${#FUNCNAME[@]}-1} "
#sudo curl -sSL https://get.docker.com/ | sh || exit 1
}
function run {
echo "INFO" "do > ${FUNCNAME[@]:0:${#FUNCNAME[@]}-1} "
#docker run -d -p 3306:3306 ${DOCKER_IMAGE_NAME} /docker.sh run_mysql
}
${@}
}
${@}
得到了一些结果:
➜ ./docker_.sh docker_ hello
INFO do docker_ hello
➜ ./docker_.sh docker_ install
INFO do > install docker_
➜ ./docker_.sh docker_ run
INFO do > run docker_
Bash 确实不是函数式编程语言。首先,函数不是 first-class 个对象;你不能传递一个函数。您可以传递函数的 name,但它只是一个名称;如果该名称被赋予新值,则旧值将丢失。
Bash 没有词法范围:bash 范围是动态的。 local
命令是一个命令,就像任何其他命令一样。它不是句法的。如果未执行,则名称不会成为本地名称。例如:
f() {
if [[ == local ]]; then local myvar=local; fi
myvar=changed
}
$ var=original
$ f local
$ echo $myvar
original
$ f global
$ echo $myvar
changed
并且bash没有闭包。您可以在函数内部定义一个函数,但是这样定义的函数不带有作用域。
$ g() {
> local myvar=inner
> f() { echo $myvar; }
> f
> }
$ myvar=outer
$ g
inner
$ f
outer
$ h() { local myvar=inside_h; f; }
$ h
inside_h
$ f
outer
Bash是“一种函数式编程语言”,它没有类。我
设法使用 Closures 的封装,但我也想做一些
反省也可以找到 docker_
parent/super/base 函数(如果你知道添加
注释以正确定义它)。
我做到了,但是用了一个肮脏的 hack super=${FUNCNAME}
。有什么解决办法
使用那种PARENT_FUNCNAME
?我有这样的文件 docker_.sh:
#!/usr/bin/env bash
function docker_ {
local super=${FUNCNAME}
function hello {
echo "INFO" "do ${super}${FUNCNAME}"
}
function install {
echo "INFO" "do ${super}${FUNCNAME}"
#sudo curl -sSL https://get.docker.com/ | sh || exit 1
}
function run {
echo "INFO" "do ${super}${FUNCNAME}"
#docker run -d -p 3306:3306 ${DOCKER_IMAGE_NAME} /docker.sh run_mysql
}
${@}
}
${@}
得到了一些结果:
$ ./docker_.sh docker_ hello
INFO do docker_hello
$ ./docker_.sh docker_ run
INFO do docker_run
$ ./docker_.sh docker_ install
INFO do docker_install
已解决
使用
${FUNCNAME[1]}
${FUNCNAME[@]:0:${#FUNCNAME[@]}-1} get all list beside main
代码:
#!/usr/bin/env bash
function docker_ {
function hello {
echo "INFO" "do ${FUNCNAME[1]} ${FUNCNAME}"
}
function install {
echo "INFO" "do > ${FUNCNAME[@]:0:${#FUNCNAME[@]}-1} "
#sudo curl -sSL https://get.docker.com/ | sh || exit 1
}
function run {
echo "INFO" "do > ${FUNCNAME[@]:0:${#FUNCNAME[@]}-1} "
#docker run -d -p 3306:3306 ${DOCKER_IMAGE_NAME} /docker.sh run_mysql
}
${@}
}
${@}
得到了一些结果:
➜ ./docker_.sh docker_ hello
INFO do docker_ hello
➜ ./docker_.sh docker_ install
INFO do > install docker_
➜ ./docker_.sh docker_ run
INFO do > run docker_
Bash 确实不是函数式编程语言。首先,函数不是 first-class 个对象;你不能传递一个函数。您可以传递函数的 name,但它只是一个名称;如果该名称被赋予新值,则旧值将丢失。
Bash 没有词法范围:bash 范围是动态的。 local
命令是一个命令,就像任何其他命令一样。它不是句法的。如果未执行,则名称不会成为本地名称。例如:
f() {
if [[ == local ]]; then local myvar=local; fi
myvar=changed
}
$ var=original
$ f local
$ echo $myvar
original
$ f global
$ echo $myvar
changed
并且bash没有闭包。您可以在函数内部定义一个函数,但是这样定义的函数不带有作用域。
$ g() {
> local myvar=inner
> f() { echo $myvar; }
> f
> }
$ myvar=outer
$ g
inner
$ f
outer
$ h() { local myvar=inside_h; f; }
$ h
inside_h
$ f
outer