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

时间:2014-03-29 23:48:01

标签: bash parallel-processing zsh gnu-parallel

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

示例:

function my_func(){ echo $1;}
export -f my_func
parallel "my_func {}" :::  1 2
bash中的

将输出

1
2

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

/bin/bash: my_func: command not found
/bin/bash: my_func: command not found

4 个答案:

答案 0 :(得分:9)

zsh没有导出函数的概念。 export -f somefunc将打印函数定义,它不会导出函数。

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

export my_func='() { echo "$1"; }'
parallel --gnu "my_func {}" ::: 1 2 

答案 1 :(得分:6)

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

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

用法

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

exportf my_func
parallel "my_func {}" :::  1 2

答案 2 :(得分:0)

自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

如果您的环境很大:

# 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

答案 3 :(得分:0)

这种方法允许您在zsh中定义一个函数(而不必担心添加引号级别)。此外,它不需要添加其他软件。

执行功能。这是一个:

function bar {
    echo bar
    echo $1
}

旋转它:

seq 10 | xargs -I{} -n1 -P1 zsh -c "$(whence -f bar); bar {}"

我目前正在使用xargs,但是对于GNU Parallel,当然使用相同的方法,所以我想在这里分享它。