Fishに '〜/ .profile`を再利用しますか?


34

(私は貝の、特に魚の魚について話している。)

Bash / ZSHの場合、~/.profileいくつかのエクスポート、エイリアス、その他のものがありました。

Fishの環境変数を個別に設定したくないので、を再利用したいです~/.profile。どうやって?

FAQには、少なくともを介してそれらをインポートできると記載され/usr/local/share/fish/tools/import_bash_settings.pyていますが、各Fishインスタンスで実行することはあまり好きではありません。

回答:


26

Bashを使用して/ etc / profileおよび〜/ .profileを解析し、fishを起動できます。

  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
念のため、だれかがMacに相当するのusermod -s /usr/local/bin/fishlogin $USERchsh -s /usr/local/fishlogin $USER
gloriphobia

1
あなたは取得した場合chsh: /usr/local/bin/fishlogin: non-standard shellにそれを追加する必要があります/etc/shells
ベン・マーテン

1
魚の発射を直接完全に模倣するにfish "$@"は、に置き換えてくださいexec -l fish "$@"execbashプロセスをfishに置き換えますが、fishの-l原因argv[0]-fishであり、これはログインシェルであることを通知します。
jhrmnn

1
@Sz。まあ、いや。魚はそもそもサブシェルをサポートしていません。そして、たとえそれが行われたとしても、ログインシェルを実行してもそうはならないので、そのときBashは生成されません。
ノエルービンシュタイン

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
これが何をするのか説明できますか?
マックスプレナー

@maxpleaner AFAICTは.profileを介してexportステートメントを探し、それらを魚のセットとして実行します。それはちょっとハッキーですが、賢いです。
ジャレッド・スミス

12

よりクリーンなソリューションを得るには、外部envプラグインを使用できます。

fenv source ~/.profile

5
これは受け入れられた解決策でなければなりません。精巧な(omfをインストールする)
ジュールランドルフ

Oh My Fishの@JulesRandolphインストールは不要です。foreign_env fishプラグインは単独でインストールでき、依存関係はありません。
ドミニカ・モスタウスキス

5

魚でbashコマンドを実行するプラグインであるbassを使用できます。

  1. bassをインストールします

    $ 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プラグインに非常に満足しています。Pythonではなくシェルで書かれており、私にとってはずっと速いようです。
mk12

ええ、@ mk12、それは素晴らしいようですが、環境変数のみをキャプチャするため、より制限されています。bass一方、bashシェルスクリプトを解釈し、魚で実行するようにします。それは確かにもう少しオーバーヘッドがありますが、私の経験では完全に無視できますが、あなたの走行距離は異なるかもしれません。
rsalmei

4

私は、魚のスタートアップで.profileを調達しようとしましたが、それは私にとって魅力的なものでした。

ただやる:

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

端末またはiterm2を再起動して、テストするエイリアス.profileをテストします。

注:fish-credit @erbでは使用できない構文を使用するより複雑な.profileファイルでは機能しません


私のためにも働いた!MacOSXを実行しています。
アレクサー

.profilefishでは使用できない構文を使用するより複雑なファイルでは機能しません。
erb

1
@erb私はあなたに同意します、私は答えに警告を加えました。
エズワールラジェシュピナパラ

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するでしょう(おそらくダッシュです)
ウェインワーナー

1

できません。fishの構文は、Bourneシェル(/bin/sh)構文とは異なります。これは、あなたが使用することはできません同じ理由である.profileような他の非ボーン由来シェル、とcshtcsh


完全に実行したくない.profileexportそこからすべてを取得したいだけです。簡単な方法の1つは、egrep "^export"すでに私にとって十分な方法です。別の、より正しい解決策はこれです。また、たとえば、import_bash_settings.pyおそらく似たようなことを行うこのスクリプトを実行できます。したがって、これを行うには明らかに多くの方法があります。ここで私の質問で、私は他の人がこれをどのように解決したのだろうと思っていました。
アルバート


1

FishはBashから起動できます。その場合、Fishはすべての環境変数(export FOO=bar)をBashから継承します。この時点で、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.