Balık için '~ / .profile` yeniden kullanın?


34

(Ben kabuk bahsediyorum Balık , esp. Fish'in Balık .)

Bash / ZSH ~/.profileiçin bazı ihracat, takma adlar ve diğer şeyler vardı.

Balık için ortam değişkenleri için ayrı bir konfigürasyona sahip olmak istemiyorum, yeniden kullanmak istiyorum ~/.profile. Nasıl?

Sıkça Sorulan Sorular’da, en azından bunları yoluyla ithal edebileceğim belirtiliyor /usr/local/share/fish/tools/import_bash_settings.py, ancak bunu her Balık örneği için çalıştırmayı sevmiyorum.

Yanıtlar:


26

/ Etc / profile ve ~ / .profile dosyasını ayrıştırmak için Bash'i kullanabilir ve ardından balığa başlayabilirsiniz.

  1. /usr/local/bin/fishloginİçeriği ile oluştur

    #!/bin/bash -l
    exec -l fish "$@"
    
  2. Çalıştırılabilir yap

    sudo chmod +x /usr/local/bin/fishlogin
    
  3. / Etc / shells'e ekle

    echo /usr/local/bin/fishlogin | sudo tee -a /etc/shells
    
  4. Varsayılan kabuğunuz olarak ayarlayın

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

Çok şık! Kabul edilen cevap olmalı IMO
yonix 22:17

2
Herkes merak ediyor Her ihtimale karşı, mac eşdeğer usermod -s /usr/local/bin/fishlogin $USERolduğunuchsh -s /usr/local/fishlogin $USER
gloriphobia

1
chsh: /usr/local/bin/fishlogin: non-standard shellEklemek gerekirse/etc/shells
Ben Marten

1
Doğrudan fırlatma balık doğrudan taklit etmek için fish "$@"ile değiştirilmelidir exec -l fish "$@". execbash işlemini balıkla değiştirir, -lbunun argv[0]nedeni balıklar için -fishbunun bir giriş kabuğu olduğunu gösterir.
jhrmnn

1
@Sz. Hayır, hayır. Balık, ilk başta deniz kabuklarını desteklemiyor. Olsa bile, giriş kabuğunuzu çalıştırarak bunu yapmazdı, o zaman hiçbir Bash ortaya çıkmayacaktı.
Noé Rubinstein

15

Mevcut çözümüm ( daha yeni bir sürüm için buraya bakınız ):

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
Bunun ne yaptığını açıklayabilir misin?
max pleaner

@maxpleaner AFAICT, ihracat bildirimleri için .profile dosyasına bakar ve bunları balık kümeleri olarak yürütür. Biraz hacky ama zekice.
Jared Smith

12

Daha temiz bir çözüm için, yabancı env eklentisini kullanabilirsiniz:

fenv source ~/.profile

5
Bu kabul edilen çözüm olmalıdır. Ayrıntılı bilgi verin (yükleyin)
Jules Randolph

@JulesRandolph Oh My Fish kurulumu gerekli değildir. Foreign_env balık eklentisi tek başına kurulabilir, bağımlılığı yoktur.
Dominykas Mostauskis

5

Sen kullanabilirsiniz bas balık bash komutları çalıştırmak için, bir eklenti.

  1. Bas yükleyin .

    $ git clone https://github.com/edc/bass.git
    $ cd bass
    $ make install
    
  2. Ve sonra, sadece Gözlerinde farklı koymak config.fish:

    bass source ~/.profile
    

Bu harika teşekkür ederim
ggnoredo

Bu yöntemi kullanacaksanız, çok yavaş olmadığından emin olun. Şahsen, kabuk başlatma gecikmimin can sıkıcı derecede uzun olduğunu fark ettim ve bası takip ettim.
mk12

@ mk12 muhtemelen bas arızası değildir .profile, çok fazla olan sizindir .
rsalmei

@ rsalmei Orada sahip olduğum her şey, bir kaç if ifadesiyle birlikte ortam değişkeni ve takma tanımlarıydı. Bash'ta gözle görülür bir gecikmeye neden olmaz. Yani bence bass hatası. Öte yandan, fenv eklentisi ile daha mutluyum . Python yerine kabuğuyla yazılmış ve benim için çok daha hızlı görünüyor.
mk12

Evet @ mk12, sadece çevre değişkenlerini yakaladığı için iyi görünüyor, ama aynı zamanda daha da sınırlı görünüyor. bassDiğer taraftan, bash shell komut dosyasını yorumlar ve bunları balıklarda çalıştırır. Kesinlikle biraz daha fazla ek yüke sahip olacak, ancak benim deneyimimde tamamen ihmal edilebilir, ancak kilometreniz değişebilir.
rsalmei

4

Balık başlangıcında kaynak bulmaya çalıştım ve bu benim için bir cazibe gibi çalıştı.

sadece yap :

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

Terminali veya iterm2'yi yeniden başlatın, denemek için bir takma adı .profiletest edin.

Not: Balıkta bulunmayan sözdizimini kullanan daha karmaşık .profile dosyalarıyla çalışmaz - credit @erb


Benim için de çalıştım! MacOSX’i çalıştırıyorum.
Alexar

.profileBalıklarda bulunmayan sözdizimini kullanan daha karmaşık dosyalarla çalışmaz .
erb

1
@ erb Seninle aynı fikirdeyim, cevapta ihtarı ekledim.
Eswar Rajesh Pinapala

3

dashBu satırı kurun ve ekleyin 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

Muhtemelen yüklemeniz bile gerekmez dash- sadece shyapacak (muhtemelen çizgidir)
Wayne Werner

1

Yapamazsın fish'ın sözdizimi Bourne shell ( /bin/sh) sözdiziminden çok farklı . Bu kullanamaz aynı nedenidir .profilegibi olmayan diğer Bourne türevi kabuklar ile cshve tcsh.


Tamamen yürütmek istemiyorum .profile. Sadece exportoradan hepsini almak istiyorum . Bunun kolay bir yolu, egrep "^export"benim için zaten yeterince iyi olurdu. Başka, daha doğru bir çözüm olacaktır bu . Ayrıca, import_bash_settings.pymuhtemelen benzer bir şey yapan bu betiği çalıştırabilirim . Yani, bunu yapmanın pek çok yolu vardır. Buradaki sorumla, başkalarının bunu nasıl çözdüğünü merak ediyordum.
Albert,


1

Balık'ı Bash'den başlatabilirsiniz. Bunu yaparsanız, Fish tüm ortam değişkenlerini ( export FOO=bar) Bash'den devralır . Bu noktada, Bash zaten .profile(veya benzerini) okumuş olacak .

bash-3.2$ export TEST="test"
bash-3.2$ fish
cmey@MBP ~> echo $TEST
test
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.