Shell

從 perl 訪問 fish 函式

  • May 20, 2015

在 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將命令的輸出放入變數中,但保留換行符嗎?

醜得要命,但有效:

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")'

fish中,您可以使用funcsave跨魚會話保存函式定義:

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

引用自:https://unix.stackexchange.com/questions/204514