web-dev-qa-db-ja.com

魚の殻からshスクリプトを「調達」する方法はありますか?

私は環境変数の定義の多くを.profileスクリプトに入れるのが好きです。 bashのようなPOSIX互換のインタラクティブシェルを使用している場合は、新しいターミナルウィンドウを開かなくても、sourceコマンドを使用して、更新時に.profileから環境変数を再エクスポートできます。変数のエクスポートに異なる構文を使用するfishを使用しているときに、同じことを行う方法はありますか? 魚にshサブプロセスを実行し、定義された変数を再エクスポートするように指示できますか?

明らかなsh .profileを実行しようとすると、環境変数は明らかに子shプロセスでのみ定義され、親fishプロセスでは更新されません。


編集:私の変数を定義するシェルコードはこれです

CAML_LD_LIBRARY_PATH="/home/hugo/.opam/4.01.0/lib/stublibs"; export CAML_LD_LIBRARY_PATH;
Perl5LIB="/home/hugo/.opam/4.01.0/lib/Perl5:"; export Perl5LIB;
OCAML_TOPLEVEL_PATH="/home/hugo/.opam/4.01.0/lib/toplevel"; export OCAML_TOPLEVEL_PATH;
MANPATH=":/home/hugo/.opam/4.01.0/man"; export MANPATH;
PATH="/home/hugo/.opam/4.01.0/bin:/home/hugo/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"; export PATH;

残念ながら、このコードは別のプログラムによって自動的に生成されるため、Fishへの変換も自動化されたプロセスを使用して行う必要があります。次のsedスクリプトを使ってみました

sed 's/\(.*\)="\(.*\)".*/set -x \1 \'\2\';/'

次のFishコードを出力します

set -x CAML_LD_LIBRARY_PATH '/home/hugo/.opam/4.01.0/lib/stublibs';
set -x Perl5LIB '/home/hugo/.opam/4.01.0/lib/Perl5:';
set -x OCAML_TOPLEVEL_PATH '/home/hugo/.opam/4.01.0/lib/toplevel';
set -x MANPATH ':/home/hugo/.opam/4.01.0/man';
set -x PATH '/home/hugo/.opam/4.01.0/bin:/home/hugo/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games';

Evalと()置換を使用して実行できるもの

eval (my-sed-script)

しかし、PATHを設定しようとすると、魚が文句を言います。特別な場合だと思います-PATHをケーシングし、単一の文字列ではなく配列を期待します。

set: Warning: path component /home/hugo/.opam/4.01.0/bin:/home/hugo/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games may not be valid in PATH.
set: No such file or directory
set: Did you mean 'set PATH $PATH /home/hugo/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games'?
5
hugomg

Bashとは異なり、fish PATHはディレクトリの配列です: http://fishshell.com/docs/current/index.html#variables

sed '/^PATH=/s/:/\' \'/g; s/\(.*\)="\(.*\)".*/set -x \1 \'\2\';/'
1
glenn jackman

shで一般的なfishスクリプトを調達する場合、1つのオプションは bass プラグインで、bashスクリプトの環境変数をfishに調達できます。

fisherman の場合は、fisher edc/bassを使用してインストールしてから、bass source <command>を実行できます。

9