![从 Perl 访问 Fish 函数](https://linux22.com/image/65409/%E4%BB%8E%20Perl%20%E8%AE%BF%E9%97%AE%20Fish%20%E5%87%BD%E6%95%B0.png)
在 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")'