Bash와 Fish 간의 환경 변수 공유

Bash와 Fish 간의 환경 변수 공유

bash와 fish 스크립트는 호환되지 않지만 bash와 fish로 초기화된 일부 환경 변수를 정의하는 파일을 원합니다.

~/.env제가 제안하는 해결책은 다음과 같은 환경 변수 목록이 포함된 파일을 정의하는 것입니다 .

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

그런 다음 bash에서 가져오고 이를 fish 형식으로 변환하고 fish로 가져오는 스크립트를 만들 수 있습니다.

이보다 더 좋은 해결책이 있지 않을까 생각하여, bash Fish 간에 환경 변수를 공유할 수 있는 더 나은 방법을 요청했습니다.

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


.env다음은 Fish와 bash가 모두 처리하는 데 사용할 수 있기를 바라는 샘플 파일입니다.말도 안되는 물고기 문법(~/bin 및 ~/bin2가 빈 디렉토리라고 가정):

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

답변1

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는 Fish에서는 배열이지만 bash에서는 콜론으로 구분된 문자열이므로 특별한 처리가 필요합니다. .env로 작성하는 것을 선호한다면 setenv PATH "$HOME/bin:$PATH"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의 어색함은 콜론으로 구분된 문자열과 실제 배열이 혼합되어 발생합니다. Fish에서 PATH에 추가하는 기본 방법은 간단합니다 set PATH $PATH ~/bin.

답변2

@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

답변3

대부분의 유닉스 시스템에서는폴리아크릴아미드. 이것pam_env기준 치수파일을 읽는 것은 .env.

리눅스에서, pam_env시스템 파일 /etc/environment과 사용자 파일을 읽습니다 ~/.pam_environment.OS X에서(및 OpenPAM을 사용하는 다른 *BSD) 시스템 파일만 읽는 것처럼 보이므로 pam_env이 방법으로 각 사용자에 대한 변수를 설정할 수 없으며 모든 사용자에 대해서만 변수를 설정할 수 있습니다.

답변4

이라는 이름의 모든 환경 변수를 저장할 파일을 만듭니다 ~/.config/env_variables. 이 파일에 export다음 줄을 추가합니다.

# This file is meant to compatible with multiple shells, including:
# bash, zsh and fish. For this reason, use this syntax:
#    export VARNAME=value

export EDITOR=vim
export LESS="-M"
export GOPATH="$HOME/.local/share/gopath/"
export PATH="$PATH:/custom/bin/"

파일 에 다음 ~/.config/fish/config.fish을 포함합니다.

source ~/.config/env_variables

파일 에 다음 ~/.bashrc을 포함합니다.

source ~/.config/env_variables

관련 정보