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

関連情報