web-dev-qa-db-ja.com

関数をサブシェルに伝播させる方法は?

Solaris/sh

を介してロードされるファイルで定義されたいくつかの関数があります

. ./some_file.sh 

サブシェルを開始するとき

sh

すべての関数定義が失われますが、

env

ソースが表示されますが、サブシェルで機能させる簡単な方法はありますか?

6
dr jerry

関数は自然にサブシェルに伝播されます:

greet () {
  echo "hello, $1"
}
( echo "this is a subshell"; greet bob )

ただし、その名前でシェルを呼び出すことから開始する独立したシェルプロセスには、伝播されません。

Bashには、環境を介して関数を渡すための拡張機能があります ですが、他のシェルにはそのようなものはありません。この機能をエミュレートすることはできますが、とにかくネストされたシェルでコードを実行する必要があります。ネストされたシェルで関数定義を入手することもできます。

関数を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 も参照してください。

7
PSchwede