Shell
從 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
將命令的輸出放入變數中,但保留換行符嗎?
醜得要命,但有效:
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