11

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

例子:

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

4 回答 4

9

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

相反,您可以依赖 bash 函数导出为以 开头的常规变量这一事实()

export my_func='() { echo "$1"; }'
parallel --gnu "my_func {}" ::: 1 2 
于 2014-03-29T23:58:27.540 回答
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
于 2014-03-30T02:39:38.327 回答
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

如果您的环境很大:

# 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
于 2018-05-23T21:50:35.653 回答
2

这种方法允许您在 zsh 中定义一个函数(无需担心添加引用级别)。它也不需要添加额外的软件。

做一个函数。这是一个:

function bar {
    echo bar
    echo $1
}

并旋转它:

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

我现在正在使用 xargs 但当然同样的方法适用于 GNU Parallel,所以我想在这里分享一下。

于 2020-04-09T19:38:54.157 回答