생선에 '~ / .profile'을 다시 사용 하시겠습니까?


33

(I 쉘에 대해서 이야기하고 물고기 ESP. 물고기의 물고기 .)

Bash / ZSH의 경우 ~/.profile수출, 별칭 및 기타 것들이있었습니다.

Fish의 환경 변수에 대한 별도의 구성을 원하지 않고 내 재사용을 원합니다 ~/.profile. 방법?

FAQ에는 적어도을 통해 가져올 수 있다고 명시되어 /usr/local/share/fish/tools/import_bash_settings.py있지만 각 물고기 인스턴스마다 실행하는 것을 좋아하지 않습니다.

답변:


26

Bash를 사용하여 / etc / profile 및 ~ / .profile을 구문 분석 한 다음 물고기를 시작할 수 있습니다.

  1. /usr/local/bin/fishlogin내용으로 작성

    #!/bin/bash -l
    exec -l fish "$@"
    
  2. 그것을 실행 가능하게 만드십시오

    sudo chmod +x /usr/local/bin/fishlogin
    
  3. / etc / shells에 추가

    echo /usr/local/bin/fishlogin | sudo tee -a /etc/shells
    
  4. 기본 쉘로 설정

    sudo usermod -s /usr/local/bin/fishlogin $USER
    

너무 우아합니다! 허용 된 답변이어야합니다 IMO
yonix

2
누군가가 궁금해하는 경우를 대비하여, 그에 상응하는 맥 usermod -s /usr/local/bin/fishlogin $USERchsh -s /usr/local/fishlogin $USER
gloriphobia

1
chsh: /usr/local/bin/fishlogin: non-standard shell추가해야 할 경우/etc/shells
Ben Marten

1
물고기를 직접 발사하는 것을 완전히 흉내 내려면 fish "$@"로 교체해야합니다 exec -l fish "$@". exec반면, 물고기와 배시 프로세스를 대체 -l원인 argv[0]어류이고 -fish, 신호는이 로그인 쉘된다.
jhrmnn

1
@Sz. 아뇨 물고기는 처음에는 서브 쉘을 지원하지 않습니다. 그리고 그렇게하더라도 로그인 쉘을 실행하여 그렇게하지 않으므로 Bash가 생성되지 않습니다.
Noé Rubinstein

15

내 현재 솔루션 ( 아마도 최신 버전 은 여기 참조 ) :

egrep "^export " ~/.profile | while read e
    set var (echo $e | sed -E "s/^export ([A-Z_]+)=(.*)\$/\1/")
    set value (echo $e | sed -E "s/^export ([A-Z_]+)=(.*)\$/\2/")

    # remove surrounding quotes if existing
    set value (echo $value | sed -E "s/^\"(.*)\"\$/\1/")

    if test $var = "PATH"
        # replace ":" by spaces. this is how PATH looks for Fish
        set value (echo $value | sed -E "s/:/ /g")

        # use eval because we need to expand the value
        eval set -xg $var $value

        continue
    end

    # evaluate variables. we can use eval because we most likely just used "$var"
    set value (eval echo $value)

    set -xg $var $value
end

3
이것이 무엇을 설명 할 수 있습니까?
max pleaner

@maxpleaner AFAICT : .profile을 통해 내보내기 명령문을 찾고이를 생선 세트로 실행합니다. 좀 해 키지 만 영리합니다.
Jared Smith

12

훨씬 깨끗한 솔루션을 위해 foreign env 플러그인을 사용할 수 있습니다 .

fenv source ~/.profile

5
이것이 허용되는 솔루션이어야합니다. 정교하게 만들 수 있습니다 (OMF 설치)
Jules Randolph

Oh My Fish의 @JulesRandolph 설치는 필요하지 않습니다. foreign_env 물고기 플러그인은 단독으로 설치할 수 있으며 종속성이 없습니다.
Dominykas Mostauskis

4

나는 물고기 시작에 .profile 소싱을 시도했고 그것은 나를 위해 매력처럼 작동했습니다.

그냥 해 :

echo 'source ~/.profile;clear;' >  ~/.config/fish/config.fish

터미널 또는 iterm2를 다시 시작하고 별명 .profile을 테스트하여 테스트하십시오.

참고 : fish에서는 사용할 수없는 구문을 사용하는 더 복잡한 .profile 파일에서는 작동하지 않습니다-credit @erb


나도 일 했어! MacOSX 실행
Alexar

.profile물고기에서는 사용할 수없는 구문을 사용 하는 더 복잡한 파일 에서는 작동 하지 않습니다.
erb

1
@erb 나는 당신에게 동의한다. 나는 대답에주의를 기울였다.
Eswar Rajesh Pinapala

4

플러그인 bass 를 사용 하여 물고기에서 bash 명령을 실행할 수 있습니다 .

  1. 베이스를 설치하십시오 .

    $ git clone https://github.com/edc/bass.git
    $ cd bass
    $ make install
    
  2. 그리고 나서, 이것을 당신의 config.fish:

    bass source ~/.profile
    

감사합니다
ggnoredo

이 방법을 사용하려면 속도가 너무 느리지 않아야합니다. 필자는 개인적으로 쉘 시작 지연이 성가 시게 길다는 것을 알아 채기 시작했다.
mk12

@ mk12 아마도 저음이 아닙니다 .profile. 너무 많은 일 이 당신의 것입니다.
rsalmei

@rsalmei 내가 가지고있는 모든 환경 변수와 별칭 정의에는 몇 가지 if 문이 있습니다. bash에서 눈에 띄는 지연이 발생하지 않습니다. 그래서 저음이 잘못이라고 생각합니다. 반면에, fenv plugin 사용하면 훨씬 행복합니다 . 파이썬보다는 쉘로 작성되었으며 훨씬 빠릅니다.
mk12

예 @ mk12, 그것은 좋은 것 같지만 환경 변수 만 캡처하기 때문에 더 제한적입니다. bass반면에 모든 bash 쉘 스크립트를 해석하여 물고기에서 실행시킵니다. 분명히 약간 더 많은 오버 헤드가 있지만 내 경험에서는 완전히 무시할 수 있지만 마일리지는 다를 수 있습니다.
rsalmei

3

dash이 라인을 설치 하고 추가하십시오 config.fish:

env -i HOME=$HOME dash -l -c 'export -p' | sed -e "/PATH/s/'//g;/PATH/s/:/ /g;s/=/ /;s/^export/set -x/" | source

아마도 설치할 필요조차 없습니다 dash– 그냥 sh할 것입니다 (아마도 대시 일 것입니다)
Wayne Werner

1

당신은 할 수 없습니다. fish의 구문이 Bourne 쉘 ( /bin/sh) 구문과 너무 다릅니다 . 이것은 당신이 사용할 수있는 동일한 이유 .profile와 같은 다른 비 Bourne의 유래 껍질로 cshtcsh.


완전히 실행하고 싶지 않습니다 .profile. 나는 export거기에서 모든 것을 얻고 싶습니다 . 한 가지 쉬운 방법은 egrep "^export"이미 나에게 충분할 것입니다. 또 다른 더 정확한 해결책은 이것 입니다. 또한 예 import_bash_settings.py를 들어이 스크립트를 실행하여 비슷한 것을 수행 할 수 있습니다 . 따라서이 작업을 수행하는 방법은 여러 가지가 있습니다. 내 질문에, 나는 다른 사람들이 어떻게 이것을 해결했는지 궁금했다.
Albert


1

Bash에서 Fish를 시작할 수 있습니다. 그렇게하면 Fish는 export FOO=barBash의 모든 환경 변수 ( )를 상속합니다 . 이 시점에서 Bash는 이미 귀하 .profile(또는 이와 유사한)를 읽었을 것 입니다.

bash-3.2$ export TEST="test"
bash-3.2$ fish
cmey@MBP ~> echo $TEST
test
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.