повторно використовувати '~ / .profile` для Риб?


34

(Я говорю про шкаралупу Риба , особливо про рибу Рибу .)

Що стосується Bash / ZSH, я мав ~/.profileпевний експорт, псевдоніми та ін.

Я не хочу мати окремий конфігурацію змінних оточуючих для Fish, я хочу повторно використовувати свою ~/.profile. Як?

У FAQ часто вказується, що я можу принаймні імпортувати їх через /usr/local/share/fish/tools/import_bash_settings.py, проте мені не дуже подобається запускати це для кожного екземпляра Fish.

Відповіді:


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 / shell

    echo /usr/local/bin/fishlogin | sudo tee -a /etc/shells
    
  4. Встановіть її як оболонку за замовчуванням

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

Так елегантно! Чи повинна бути прийнята відповідь ІМО
— йонікс

2
Тільки в разі , якщо хто - то цікаво, макінтош еквівалент usermod -s /usr/local/bin/fishlogin $USERстановитьchsh -s /usr/local/fishlogin $USER
— gloriphobia

1
Якщо вам chsh: /usr/local/bin/fishlogin: non-standard shellпотрібно додати його до/etc/shells
— Бен Мартен

1
Щоб повністю імітувати запуск риби безпосередньо, її fish "$@"слід замінити на exec -l fish "$@". execзамінює процес bash на рибу, в той час як -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 для експорту заявок та виконує їх як рибні набори. Це ніби хакі, але розумно.
— Джаред Сміт

12

Для набагато чистішого рішення ви можете використовувати плагін іноземного env :

fenv source ~/.profile

5
Це має бути прийнятим рішенням. Ви можете розробити (встановити omf)
— Jules Randolph,

@JulesRandolph установка Oh My Fish не потрібна. Модуль fish_env може встановлюватися самостійно, він не має залежностей.
— Домінікас Мостаскіс

5

Ви можете використовувати бас , плагін для виконання команд 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 твердженнями. Це не викликає помітної затримки баш. Тому я вважаю, що це вина. З іншого боку, я набагато щасливіший з плагіном fenv . Він написаний шкаралупою, а не Python і здається мені набагато швидшим.
— mk12

Так @ mk12, здається, це приємно, але також обмежено, оскільки він фіксує лише змінні середовища. bassз іншого боку, інтерпретує будь-який скрипт bash shell і змушує їх виконувати рибу. Це, безумовно, матиме трохи більше накладних витрат, але абсолютно мізерно, на мій досвід, але ваш пробіг може відрізнятися.
— rsalmei

4

Я спробував знайти .profile при запуску риби, і це спрацювало як шарм для мене.

просто роби:

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

Перезапустіть термінал або iterm2, протестуйте псевдонім від .profileтестувати.

Примітка. Не працюватимуть із більш складними .profile-файлами, які використовують синтаксис, недоступний у рибі - Credit @erb


Працювали і для мене! Запуск MacOSX.
— Алексар

Не працюватимуть із більш складними .profileфайлами, які використовують синтаксис, недоступний у рибі.
— 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синтаксис сильно відрізняється від /bin/shсинтаксису Bourne shell ( ). Це та сама причина, яку ви не можете використовувати .profileз іншими оболонками, не отримані Борном, такими як cshі tcsh.


Я не хочу повністю виконувати .profile. Я просто хочу, щоб exportзвідти все було. Один з простих способів був би таким, egrep "^export"який був би досить хорошим для мене. Іншим, правильнішим рішенням було б таке . Крім того, я, наприклад, міг би запустити цей import_bash_settings.pyсценарій, який, ймовірно, робить щось подібне. Отже, очевидно є багато способів зробити це. Зі свого запитання тут мені було цікаво, як інші вирішили це.
— Альберт

1

Якщо ваш дистрибутив використовує PAM , ви можете встановити змінні середовища у вашому ~/.pam_environmentфайлі.


1

Ви можете почати Рибу з Bash. Якщо ви це зробите, Fish успадкує всі змінні середовища ( export FOO=bar) від Bash. У цей момент Bash вже прочитав ваше .profile(або подібне).

bash-3.2$ export TEST="test"
bash-3.2$ fish
cmey@MBP ~> echo $TEST
test
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.