在foo
后台运行时,BASHPID
of foo
( ) 在 via 的主体内bashpid_of_foo
不可用,因为它们是通过以下的命令替换功能调用的:bar_1
bar_n
$BASHPID
bash
function foo() {
local bashpid_of_foo=$BASHPID
local output
# desired to be shared by all Command Substitutions
# in the body of this function.
local log=/path/to/log.$BASHPID
... >> $log
output=$(bar_1 ...)
...
output=$(bar_n ...)
}
function bar_1() {
# log only specific (and NOT all) messages
# to the shared log file of the invoking thread.
... >> /path/to/log.$BASHPID
}
foo &
foo &
问题:是否有绕过上述限制的优雅方法,而无需bashpid_of_foo
通过临时环境变量或外部磁盘文件?
我所说的优雅,是指bar_*
仅依靠 bash 提供的特性来保持接口和函数体的清洁。(例如BASHPID
是一个bash
特征。)
如果我尝试BASHPID
像这样覆盖 的值,
out_1=$(BASHPID=$BASHPID bar_1 ...)
...它(正确地)抱怨BASHPID
是一个只读变量。
编辑:(1)添加了bar_1
上面的定义。(2) 在后台添加了第二次调用foo
。每次foo
调用都需要维护自己的日志文件,因为写入公共文件可能会导致内容乱码。
注意:无论在. foo
_ _ 可以在后台运行多个实例。foo
/path/to/log.$BASHPID
foo
foo