배쉬와 물고기 사이의 환경 변수 공유


13

bash와 fish 스크립트는 호환되지 않지만 bash와 fish 모두에 의해 초기화 될 일부 환경 변수를 정의하는 파일을 갖고 싶습니다.

내 제안 솔루션은 ~/.env다음과 같은 환경 변수 목록을 포함 하는 파일을 정의합니다 .

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

그런 다음 bash로 소스를 만들고 물고기 형식으로 변환하고 물고기에서 소스로 변환하는 스크립트를 만들 수 있습니다.

나는 이것보다 더 나은 해결책이있을 것이라고 생각했기 때문에 배쉬 피쉬간에 환경 변수를 공유하는 더 좋은 방법을 요구하고 있습니다.

참고 : OS X를 사용하고 있습니다.


다음은 어리석은 물고기의 구문을.env 사용하여 fish와 bash를 모두 처리하려는 예제 파일입니다 (~ / bin 및 ~ / bin2는 빈 디렉토리라고 가정).

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

답변:


17

bash에는 환경 변수 설정을위한 특수 구문이 있으며, 물고기는 내장 기능을 사용합니다. .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 로 쓰는 것을 선호한다면 물고기의 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물고기에 대한 수정은 공백이있는 경로에서 작동합니까? 줄 바꿈? 다른 것들을 찾아야합니까?
Tyilo

[은 bash와 fish 모두에 내장되어 있으므로 PATH를 올바르게 설정하지 않아도됩니다 [. setenv 샘플은 콜론과 개행을 제외한 PATH의 모든 문자와 함께 작동해야합니다.
ridiculous_fish

교체 tr와 함께 /usr/bin/trI 및 사용하여 .env물고기를 시작할 때 내 질문에 제공된 파일을, 나는 많은 오류를 얻을. PATH 처리가 정확하지 않다고 생각합니다.
Tyilo

아, 맞아요. 물고기는 따옴표 안에 공간을 구분합니다. 의견을 업데이트하겠습니다.
ridiculous_fish

예, 지금 작동합니다. 어쨌든 다른 쉘 (물고기 제외)은 콜론으로 경로를 허용한다고 생각하지 않습니다.
Tyilo

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


특별한 문법없이 훨씬 더 편리합니다. 감사합니다
Panayotis 2016 년

$ PATH와 같은 배열에서는 작동하지 않습니다
JanKanis

5

대부분의 유닉스 시스템은 PAM을 사용 합니다. pam_env모듈은 당신처럼 대단히 파일을 읽습니다 .env.

Linux 에서는 pam_env시스템 파일 /etc/environment과 사용자 파일을 읽습니다 ~/.pam_environment. OS 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

물고기 @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

/etc/profile.d 폴더의 bash에서 작성된 모든 vars를 공유했습니다.

예를 들면 다음과 같습니다. /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

그냥 물고기 나 bash에 로그인 echo $GOPATH $GOROOT $GOBIN $PATH하고 마술을보십시오 :)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.