在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
注意: 关于您的一般问题
$BASHPID
,这是只读的,您不能对其进行操作。这是设计使然。通常我的一般建议是,当您使用这样的 Bash 脚本达到复杂程度时,是时候将其转移到 Python、Ruby 等等。
你的例子
我想我不明白你的问题是什么,这对我有用:
增加出口
如果我们通过制作
bar_1
一个 shell 脚本来改变它:并像这样更改您的原始脚本:
我们可以看到
$bashpid_of_foo
正在正确导出到子shell:我们需要在
export
这里使用 a 而不仅仅是 alocal
因为否则环境变量将不会被导出到任何孩子。子壳在这里是子壳。示例运行:
foo
对于脚本主要部分中的每次调用,bar
将进行四次调用并产生四行输出。如您所见,只有三个唯一bashpid
编号,每个编号都来自一次foo
调用。$bashpid
从foo
to传递的另一种方法bar
显然是将它作为命令行参数传递并使用local bashpid="$1"
inbar
或类似的东西接收它,但你说你不想这样做。