gunakan kembali '~ / .profile` untuk Ikan?

34

(Saya sedang berbicara tentang Ikan kerang , terutama Ikan Ikan .)

Untuk Bash / ZSH, saya memiliki ~/.profilebeberapa ekspor, alias, dan hal-hal lainnya.

Saya tidak ingin memiliki konfigurasi terpisah untuk variabel lingkungan untuk Fish, saya ingin menggunakan kembali ~/.profile. Bagaimana?

Dalam FAQ, dinyatakan bahwa saya setidaknya dapat mengimpornya melalui /usr/local/share/fish/tools/import_bash_settings.py, namun saya tidak begitu suka menjalankannya untuk setiap instance Ikan.

Albert
sumber

Jawaban:

26

Anda dapat menggunakan Bash untuk mengurai / etc / profile dan ~ / .profile, lalu mulai memancing.

  1. Buat /usr/local/bin/fishlogindengan konten

    #!/bin/bash -l
    exec -l fish "$@"
    
  2. Jadikan itu dapat dieksekusi

    sudo chmod +x /usr/local/bin/fishlogin
    
  3. Tambahkan ke / etc / shells

    echo /usr/local/bin/fishlogin | sudo tee -a /etc/shells
    
  4. Jadikan itu sebagai shell default Anda

    sudo usermod -s /usr/local/bin/fishlogin $USER
    
Noé Rubinstein
sumber
Sangat elegan! Seharusnya jawaban yang diterima IMO
yonix
2
Kalau-kalau ada yang bertanya-tanya, setara mac usermod -s /usr/local/bin/fishlogin $USERadalahchsh -s /usr/local/fishlogin $USER
gloriphobia
1
Jika Anda chsh: /usr/local/bin/fishlogin: non-standard shellperlu menambahkannya ke/etc/shells
Ben Marten
1
Untuk sepenuhnya meniru peluncuran ikan secara langsung, fish "$@"harus diganti dengan exec -l fish "$@". execmenggantikan proses bash dengan ikan, sementara -lmenyebabkan argv[0]untuk ikan -fish, yang menandakan bahwa ini adalah shell login.
jhrmnn
1
@Sz. Ya, tidak. Ikan tidak mendukung subkulit di tempat pertama. Dan bahkan jika itu terjadi, itu tidak akan melakukannya dengan mengeksekusi shell login Anda, jadi tidak ada Bash yang akan muncul saat itu.
Noé Rubinstein
15

Solusi saya saat ini (lihat di sini untuk versi yang mungkin lebih baru):

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
Albert
sumber
3
dapatkah Anda menjelaskan apa yang dilakukannya?
max pleerer
@maxpleaner AFAICT memeriksa melalui. profil untuk pernyataan ekspor dan mengeksekusinya sebagai kumpulan ikan. Agak aneh, tapi pintar.
Jared Smith
12

Untuk solusi yang jauh lebih bersih, Anda dapat menggunakan plugin env asing :

fenv source ~/.profile
jgillich
sumber
5
Ini harus menjadi solusi yang diterima. Anda dapat menguraikan (menginstal omf)
Jules Randolph
@JulesRandolph pemasangan Oh My Fish tidak diperlukan. Plugin foreign_env fish dapat diinstal sendiri, tidak memiliki dependensi.
Dominykas Mostauskis
5

Anda dapat menggunakan bass , sebuah plugin untuk menjalankan perintah bash pada fish.

  1. Pasang bass .

    $ git clone https://github.com/edc/bass.git
    $ cd bass
    $ make install
    
  2. Dan kemudian, letakkan ini di config.fish:

    bass source ~/.profile
    
rsalmei
sumber
ini luar biasa terima kasih
ggnoredo
Jika Anda akan menggunakan metode ini, pastikan itu tidak terlalu lambat. Saya pribadi mulai memperhatikan bahwa penundaan startup shell saya sangat panjang, dan melacaknya menjadi bass.
mk12
@ mk12 mungkin ini bukan kesalahan bass, ini adalah Anda .profileyang memiliki terlalu banyak hal yang terjadi.
rsalmei
@rsalmei Semua yang saya miliki di sana adalah variabel lingkungan dan definisi alias, dengan beberapa pernyataan if. Itu tidak menyebabkan penundaan bash. Jadi saya pikir itu salah bass. Di sisi lain, saya jauh lebih bahagia dengan plugin fenv . Itu ditulis dalam shell daripada Python dan tampaknya jauh lebih cepat bagi saya.
mk12
Yeah @ mk12, sepertinya bagus, tetapi juga jauh lebih terbatas, karena hanya menangkap variabel lingkungan. bassdi sisi lain menafsirkan skrip bash shell, dan membuatnya berjalan di ikan. Ini tentu akan memiliki overhead yang sedikit lebih banyak, tetapi benar-benar diabaikan dalam pengalaman saya, tetapi jarak tempuh Anda dapat bervariasi.
rsalmei
4

Saya mencoba mencari. Profil pada startup ikan dan itu bekerja seperti pesona bagi saya.

lakukan saja :

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

Mulai ulang terminal atau iterm2, uji alias dari .profileuntuk menguji.

Catatan: Tidak akan bekerja dengan file profil. Lebih kompleks yang menggunakan sintaksis tidak tersedia di ikan - kredit @erb

Eswar Rajesh Pinapala
sumber
Bekerja untuk saya juga! Menjalankan MacOSX.
Alexar
Tidak akan bekerja dengan .profilefile yang lebih kompleks yang menggunakan sintaksis tidak tersedia di fish.
erb
1
@erb saya setuju dengan Anda, saya menambahkan peringatan dalam jawabannya.
Eswar Rajesh Pinapala
3

Pasang dashdan tambahkan baris ini ke 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
yegorius
sumber
Mungkin bahkan tidak perlu menginstal dash- hanya shakan melakukan (yang mungkin dasbor)
Wayne Werner
1

Kamu tidak bisa fishSintaksnya terlalu berbeda dari /bin/shsintaks Bourne shell ( ). Ini adalah alasan yang sama yang tidak dapat Anda gunakan .profiledengan cangkang non-Bourne lainnya, seperti cshdan tcsh.

Spiff
sumber
Saya tidak ingin mengeksekusi sepenuhnya .profile. Saya hanya ingin mendapatkan semua exportdari sana. Satu cara mudah adalah dengan cara egrep "^export"yang sudah cukup baik bagi saya. Solusi lain yang lebih tepat adalah ini . Juga, saya misalnya dapat menjalankan import_bash_settings.pyskrip ini yang mungkin melakukan hal serupa. Jadi, jelas ada banyak cara untuk melakukan ini. Dengan pertanyaan saya di sini, saya bertanya-tanya bagaimana orang lain bisa menyelesaikan ini.
Albert
1

Jika distribusi Anda menggunakan PAM , Anda bisa mengatur variabel lingkungan Anda di ~/.pam_environmentfile Anda .

kzh
sumber
1

Anda dapat memulai Fish dari Bash. Jika Anda melakukannya, Fish akan mewarisi semua variabel lingkungan ( export FOO=bar) dari Bash. Pada titik ini, Bash sudah akan membaca .profile(atau sejenisnya) Anda.

bash-3.2$ export TEST="test"
bash-3.2$ fish
cmey@MBP ~> echo $TEST
test
cmey
sumber