повторно використовувати '~ / .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.