如何在 Bourne shell 中导出函数?
How to export a function in Bourne shell?
是否可以在 Bourne 中导出函数 shell (sh)?
this question 中的答案指出了如何为 bash
、ksh
和 zsh
这样做,但 none 说明是否 sh
支持。
如果sh
肯定不允许,我就不花时间去找了
不,不可能。
The POSIX spec for export 很明显,它只支持变量。 typeset
和其他在最近的 shell 中用于此目的的扩展只是 - 扩展 - 在 POSIX.
中不存在
没有。 export
的 POSIX 规范缺少 bash 中允许导出函数的 -f
。
一个(非常冗长的)解决方法是将您的函数保存到一个文件中并在子脚本中获取它。
script.sh:
#!/bin/sh --
function_holder="$(cat <<'EOF'
function_to_export() {
printf '%s\n' "This function is being run in [=10=]"
}
EOF
)"
function_file="$(mktemp)" || exit 1
export function_file
printf '%s\n' "$function_holder" > "$function_file"
. "$function_file"
function_to_export
./script2.sh
rm -- "$function_file"
script2.sh:
#!/bin/sh --
. "${function_file:?}"
function_to_export
运行 script.sh 来自终端:
[user@hostname /tmp]$ ./script.sh
This function is being run in ./script.sh
This function is being run in ./script2.sh
Eval 是邪恶的,但在某些情况下您可以使用 eval
。当然你应该明白你在做什么
#myfunc.sh
myfunc()
{
#do somthing
}
#script.sh
eval "$(cat myfunc.sh)"
myfunc
是否可以在 Bourne 中导出函数 shell (sh)?
this question 中的答案指出了如何为 bash
、ksh
和 zsh
这样做,但 none 说明是否 sh
支持。
如果sh
肯定不允许,我就不花时间去找了
不,不可能。
The POSIX spec for export 很明显,它只支持变量。 typeset
和其他在最近的 shell 中用于此目的的扩展只是 - 扩展 - 在 POSIX.
没有。 export
的 POSIX 规范缺少 bash 中允许导出函数的 -f
。
一个(非常冗长的)解决方法是将您的函数保存到一个文件中并在子脚本中获取它。
script.sh:
#!/bin/sh --
function_holder="$(cat <<'EOF'
function_to_export() {
printf '%s\n' "This function is being run in [=10=]"
}
EOF
)"
function_file="$(mktemp)" || exit 1
export function_file
printf '%s\n' "$function_holder" > "$function_file"
. "$function_file"
function_to_export
./script2.sh
rm -- "$function_file"
script2.sh:
#!/bin/sh --
. "${function_file:?}"
function_to_export
运行 script.sh 来自终端:
[user@hostname /tmp]$ ./script.sh
This function is being run in ./script.sh
This function is being run in ./script2.sh
Eval 是邪恶的,但在某些情况下您可以使用 eval
。当然你应该明白你在做什么
#myfunc.sh
myfunc()
{
#do somthing
}
#script.sh
eval "$(cat myfunc.sh)"
myfunc