如何将函数传播到子shell?

如何将函数传播到子shell?

索拉里斯 / 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

另请参阅https://docstore.mik.ua/orelly/unix3/upt/ch29_13.htm

相关内容