私は環境変数の定義の多くを.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'?
Bashとは異なり、fish PATHはディレクトリの配列です: http://fishshell.com/docs/current/index.html#variables
sed '/^PATH=/s/:/\' \'/g; s/\(.*\)="\(.*\)".*/set -x \1 \'\2\';/'