повторно использовать '~ / .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
Только в случае , если кто - то интересно, макинтош эквивалент 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 на fish, в то время как -lпричина argv[0]для fish - это означает -fish, что это оболочка входа в систему.
1828 года

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)
Жюль Рэндольф

@JulesRandolph установка Oh My Fish не требуется. Плагин foreign_env fish можно установить отдельно, он не имеет зависимостей.
Доминикас Мостаускис

5

Вы можете использовать bass , плагин для выполнения команд bash в fish.

  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. Это не вызывает заметной задержки в bash. Так что я думаю, что это вина баса. С другой стороны, я намного счастливее с плагином fenv . Он написан скорее на оболочке, чем на Python, и кажется мне намного быстрее.
mk12

Да, @ mk12, это кажется хорошим, но также и более ограниченным, поскольку он только захватывает переменные окружения. bassс другой стороны, интерпретирует любой скрипт оболочки bash и заставляет их запускаться в fish. Это, конечно, будет немного больше накладных расходов, но, по моему опыту, совершенно незначительно, но ваш пробег может отличаться.
rsalmei

4

Я попытался найти .profile при запуске рыбы, и это сработало для меня как шарм.

просто сделать :

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

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

Примечание: не будет работать с более сложными файлами .profile, которые используют синтаксис, недоступный в fish - credit @erb


У меня тоже сработало! Запуск MacOSX.
Алексар

Не будет работать с более сложными .profileфайлами, которые используют синтаксис, недоступный в fish.
Еврорадио

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

Вы можете начать Рыбу из Баш. Если вы сделаете это, 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.