将函数从zsh导出到bash以便在gnu parallel中使用

Bil*_*ain 8 parallel-processing bash zsh gnu-parallel

如何从zsh导出函数,以便我可以在gnu parallel中使用它?

例:

function my_func(){ echo $1;}
export -f my_func
parallel "my_func {}" :::  1 2
Run Code Online (Sandbox Code Playgroud)

在bash中输出

1
2
Run Code Online (Sandbox Code Playgroud)

而在zsh中它将输出错误消息

/bin/bash: my_func: command not found
/bin/bash: my_func: command not found
Run Code Online (Sandbox Code Playgroud)

tha*_*guy 9

zsh没有导出功能的概念.export -f somefunc将打印功能定义,它不会导出功能.

相反,您可以依赖于bash函数作为常规变量导出的事实,从以下开始():

export my_func='() { echo "$1"; }'
parallel --gnu "my_func {}" ::: 1 2 
Run Code Online (Sandbox Code Playgroud)

  • 作为GNU Parallel的作者,我可以说GNU Parallel在将函数传递给远程机器时依赖于它.我感到非常困惑,当我发现你不能有一个以'()开头的正常变量{'这有非常意外的结果:i ='(){'bash -c'echo $ i' (4认同)
  • @nachocab 是的:Bash 中的 Shellshock 修复似乎解决了该解决方法。目前我没有解决方案。如果你找到了,请告诉我。 (2认同)
  • @ssdecontrol 否。使用 env_parallel 导入 zsh 函数、变量和数组。 (2认同)

Bil*_*ain 6

根据其他人的答案.您可以编写一个函数来导出已定义为bash的zsh函数

function exportf (){
    export $(echo $1)="`whence -f $1 | sed -e "s/$1 //" `"
}
Run Code Online (Sandbox Code Playgroud)

用法

function my_func(){
    echo $1;
    echo "hello";
}

exportf my_func
parallel "my_func {}" :::  1 2
Run Code Online (Sandbox Code Playgroud)

  • 精彩的功能.经过您的许可,它将进入GNU Parallel的手册页.有一个小障碍:如果$ SHELL = zsh,它不起作用.所以你需要覆盖SHELL =/bin/bash (2认同)

Ole*_*nge 5

自 2014 年以来发生了很多变化。

今天你只需要做:

# Activate env_parallel function (can be done in .zshenv)
. `which env_parallel.zsh`

function my_func(){ echo $1;}
env_parallel "my_func {}" :::  1 2
Run Code Online (Sandbox Code Playgroud)

如果您的环境很大:

# Activate env_parallel function (can be done in .zshenv)
. `which env_parallel.zsh`

# Record which environment to ignore
env_parallel --session

function my_func(){ echo $1;}
env_parallel "my_func {}" :::  1 2
Run Code Online (Sandbox Code Playgroud)