索拉里斯 / sh
我在一个文件中定义了一些函数,这些函数通过以下方式加载
. ./some_file.sh
当我启动一个子shell时
sh
我所有的函数定义都丢失了,但是当我这样做时
env
我确实看到了源代码,有没有一种简单的方法可以让它们在我的子 shell 中发挥作用?
答案1
函数自然地传播到子壳:
greet () {
echo "hello, $1"
}
( echo "this is a subshell"; greet bob )
但它们不会也不能传播到独立的 shell 进程,这些进程是通过以其名称调用 shell 来启动的。
Bash 有一个扩展可以通过环境传递函数,但其他shell中没有这样的东西。虽然您可以模拟该功能,但无论如何它都需要在嵌套 shell 中运行代码。您也可以在嵌套 shell 中获取函数定义。
答案2
您可以传播函数从 bash 到 bash子壳:
function greet1 {
echo "moin, $1"
}
typeset -fx greet1
greet2() {
echo "servus, $1"
}
typeset -fx greet2
echo "greet1 bob; greet2 alice" | bash
输出:
moin, bob
servus, alice