bashとfishの間で環境変数を共有する


13

bashスクリプトとfishスクリプトは互換性がありませんが、bashとfishの両方によって初期化されるいくつかの環境変数を定義するファイルが欲しいです。

私の提案する解決策は、次の~/.envような環境変数のリストを含むファイルを定義することです。

PATH="$HOME/bin:$PATH"
FOO="bar"

次に、bashでソースを作成し、それをfish形式に変換するスクリプトを作成し、fishのソースを作成します。

私はこれよりも良い解決策があるかもしれないと考えていたので、bash fish間で環境変数を共有するより良い方法を求めています。

注:OS Xを使用しています。


以下は、.envfishとbashの両方をとんでもない魚の構文を使って処理したいファイルの例です(〜/ binと〜/ bin2は空のディレクトリであると仮定します):

setenv _PATH "$PATH"
setenv PATH "$HOME/bin"
setenv PATH "$PATH:$HOME/bin2"
setenv PATH "$PATH:$_PATH"

回答:


16

bashには環境変数を設定するための特別な構文がありますが、fishは組み込みを使用します。.envファイルを次のように書くことをお勧めします。

setenv VAR1 val1
setenv VAR2 val2

そしてsetenv、それぞれのシェルで適切に定義します。bash(例:.bashrc):

function setenv() { export "$1=$2"; }
. ~/.env

魚の場合(例:config.fish):

function setenv; set -gx $argv; end
source ~/.env

PATHは魚の配列ですが、bashのコロン区切りの文字列なので、特別な処理が必要になることに注意してください。setenv PATH "$HOME/bin:$PATH".envで記述したい場合は、次のようにfishのsetenvを記述できます。

function setenv
    if [ $argv[1] = PATH ]
        # Replace colons and spaces with newlines
        set -gx PATH (echo $argv[2] | tr ': ' \n)
    else
        set -gx $argv
    end
 end

これは、スペース、コロン、または改行を含むPATHの要素を誤って処理します。

PATHの扱いにくさは、コロンで区切られた文字列と実際の配列が混在しているためです。魚のPATHに追加する好ましい方法は、単純set PATH $PATH ~/binです。


1
PATH魚の修正は、スペースのあるパスで動作しますか?改行?他に注意すべきことは?
ティロ14

[はbashとfishの両方に組み込まれているため、を使用するためにPATHを正しく設定する必要はありません[。setenvサンプルは、コロンと改行を除くPATHのすべての文字で動作するはずです。
ridiculous_fish 14

私と置き換えtrて、質問で提供され/usr/bin/tr.envファイルを使用すると、fishを起動するときに多くのエラーが発生します。PATH処理が正しいとは思わない。
ティロ14

ああ、そう、魚は引用符の中でスペースで区切るだろう。コメントを更新します。
ridiculous_fish 14

はい、動作します。とにかく、PATHにコロンを含むパスを許可する他のシェル(魚以外?)はないと思います。
ティロ14

6

ここに@Zancheyの答えごとに、(今?)簡単な方法があります

Fish Shell:エクスポートを使用してファイルから複数の環境変数を設定する方法

ただし、ダイジェストは次のとおりです。

魚:

echo -e "foo=3\nfoobar=4" > .env; export (cat .env); env | grep foo

バッシュ:

echo -e "foo=3\nfoobar=4" > .env; export $(cat .env | xargs); env | grep foo

違い$との使用でxargs


はるかに便利で、特別な構文はありません。ありがとう
パナヨティス

$ PATHなどの配列では機能しません
-JanKanis

5

ほとんどのUnixシステムはPAMを使用します。pam_envモジュールは、あなたのように非常に多くのファイルを読み込みます.env

Linuxではpam_env、システムファイル/etc/environmentとユーザーファイルを読み取ります~/.pam_environmentOS X(および同様にOpenPAMを使用する他の* BSD)ではpam_env、システムファイルのみを読み取るように見えるため、この方法でユーザーごとに変数を設定することはできません。すべてのユーザーに対してのみです。


1

@ridiculous_fishの答えを拡張して、bashの次の関数を使用$PATHすると、パスにスペースがある場合など、スペースを含む配列でも機能します。ただしsetenv、最近では魚の標準ライブラリで既に関数として定義されているため、ここで名前をshenv

function shenv { 
        var="$1"
        shift
        export "$var=$(printf "%s\n" "$@" | paste -s -d: -)"
}
. ~/.env

これで、.envファイル内で、setenvコマンドの個別の引数として配列コンポーネントを指定できます。

shenv PATH /my/path /my/path\ with\ spaces "/my/quoted path" $PATH

fishの場合、@ ridiculous_fishの単純な実装は次のことを行います。

function shenv; set -gx $argv; end
source ~/.env

1

$ HOME / .config / fish / functions / env.fishに次の内容の関数を作成するだけです:

for f in /etc/profile.d/*.sh
    sh $f
end

bashのフォルダー/etc/profile.dで作成されたすべての変数を共有しました

例:/etc/profile.d/golang.sh

#!/bin/sh
export GOPATH=$HOME/gopath
export GOROOT=$HOME/go
export GOBIN=$HOME/gobin

export PATH=$PATH:$GOROOT/bin:$GOBIN

魚またはバッシュにログインしてecho $GOPATH $GOROOT $GOBIN $PATH、魔法を見てください:)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.