我想要实现的是在函数中创建本地函数。同时,本地函数不会覆盖外部函数。下面是一个简单函数和带有参数的嵌套函数的示例,用于说明我的问题。
#!/bin/bash
usage() #<------------------------------- same function name
{
echo "Overall Usage"
}
function_A()
{
usage() #<--------------------------- same function name
{
echo "function_A Usage"
}
for i in "$@"; do
case $i in
--help)
usage
shift
;;
*)
echo "flag provided but not defined: ${i%%=*}"
echo "See '$0 --help'."
exit 0
;;
esac
done
}
function_A --help
usage
这是输出。
function_A Usage
function_A Usage
但我想要的是
function_A Usage
Overall Usage
是否可以在不改变其(功能)名称和顺序的情况下实现?请?
注意:我尝试了local usage()
,但它似乎不适用于功能。
答案 0 :(得分:12)
Bash不支持本地功能,但根据您的特定脚本和架构,您可以通过子shell控制功能名称的范围。
通过在定义中将{..}
替换为(..)
,您将获得所需的输出。 usage
的新定义仅限于该功能,但例如变量的任何变化:
#!/bin/bash
usage()
{
echo "Overall Usage"
}
function_A()
( # <-- Use subshell
usage()
{
echo "function_A Usage"
}
for i in "$@"; do
case $i in
--help)
usage
shift
;;
*)
echo "flag provided but not defined: ${i%%=*}"
echo "See '$0 --help'."
exit 0
;;
esac
done
)
function_A --help
usage
答案 1 :(得分:1)
来自man bash
:
复合命令
复合命令是以下命令之一:
(列表)列表在子Shell环境中执行(请参见下面的“命令执行环境”)。在命令完成后,影响外壳环境的变量分配和内置命令将保持无效。返回状态是列表的退出状态。 ...
#!/usr/bin/sh
topFunction1() {
# start subshell
(
innerFunction1() {
echo "innerFunction1"
}
echo "topFunction1 can call $(innerFunction1) from within the subshell"
)
# end subshell
innerFunction2() {
echo "innerFunction2"
}
}
topFunction2() {
echo "topFunction2"
}
source test.sh
。以下命令成功执行:
topFunction2
以下命令失败:
innerFunction1
innerFunction2
topFunction1
,我们将得到包含innerFunction1
输出的输出:
topFunction1可以从子shell内调用innerFunction1
此时,以下命令已成功完成:
topFunction1
topFunction2
innerFunction2
人们可以注意到,现在innerFunction2
在调用topFunction1
之后在全局可见。
但是innerFunction1
仍然是“隐藏”的子外壳调用,这可能是您想要的。
对innerFunction1
的另一个调用将失败。
答案 2 :(得分:0)
扩展that other guy的答案:
$ function zz() (:;)
$ declare -f zz
zz ()
{
( : )
}
您会看到,用括号而不是花括号来定义函数只是用括号括住函数的整个内部的简写。该功能实际上以其长格式进行标识。
https://www.tldp.org/LDP/abs/html/subshells.html https://www.gnu.org/software/bash/manual/html_node/Command-Grouping.html#Command-Grouping