从 Perl 访问 Fish 函数

从 Perl 访问 Fish 函数

在 bash 中我可以这样做:

foo() { echo bar; }
export -f foo
perl -e 'system "bash -c foo"'

我还可以访问函数定义:

perl -e 'print "foo".$ENV{"BASH_FUNC_foo%%"}'

我如何在 中做同样的事情fish

编辑:

这样我就可以得到函数定义:

functions -n | perl -pe 's/,/\n/g' | while read d; functions $d; end

如果我可以将其放入可从 Perl 访问的环境变量中,我应该能够在执行命令之前执行它。非常类似于:

setenv funcdefs (functions -n | perl -pe 's/,/\n/g' | while read d; functions $d; end)
perl -e 'system($ENV{"funcdefs"},"foo")'

但似乎设置funcdefs忽略了换行符: $ENV{"funcdefs"} 是一行非常长的行。

奇怪的是,似乎fish 支持包含换行符的环境变量:

setenv newline 'foo
bar'
echo "$newline"

我可以鼓励fish将命令的输出放入变量中,但保留换行符吗?

答案1

在 中fish,您可以使用功能保存在 Fish 会话中保存函数定义:

$ function qwerty
    echo qwerty
end
$ funcsave qwerty
$ fish -c qwerty
qwerty
$ perl -e 'system "fish -c qwerty"'
qwerty

答案2

丑陋如地狱,但有效:

function foo
  echo bar;
end

setenv funcdefs (functions -n | perl -pe 's/,/\n/g' | while read d; functions $d; end|perl -pe 's/\n/\001/')
perl -e '$ENV{"funcdefs"}=~s/\001/\n/g;system ("fish", "-c", $ENV{funcdefs}."foo")'

相关内容