повторно использовать '~ / .profile` для рыбы?

13944
Albert

(Я говорю о Рыбе- ракушке, особенно Рыба Рыбы .)

Для Bash / ZSH у меня были ~/.profileнекоторые экспорты, псевдонимы и другие вещи.

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

В FAQ указано, что я могу, по крайней мере, импортировать их через /usr/local/share/fish/tools/import_bash_settings.py, однако мне не очень нравится запускать их для каждого экземпляра Fish.

24

9 ответов на вопрос

18
Noé Rubinstein

You can use Bash to parse /etc/profile and ~/.profile, and then start fish.

  1. Create /usr/local/bin/fishlogin with contents

    #!/bin/bash -l exec -l fish "$@" 
  2. Make it executable

    sudo chmod +x /usr/local/bin/fishlogin 
  3. Add it to /etc/shells

    echo /usr/local/bin/fishlogin | sudo tee -a /etc/shells 
  4. Set it as your default shell

    sudo usermod -s /usr/local/bin/fishlogin $USER 
Так элегантно! Должен быть принят ответ IMO yonix 7 лет назад 0
На всякий случай, если кому-то интересно, эквивалент mac `usermod -s / usr / local / bin / fishlogin $ USER` это` chsh -s / usr / local / fishlogin $ USER` gloriphobia 6 лет назад 2
Если вы получили `chsh: / usr / local / bin / fishlogin: нестандартная оболочка`, необходимо добавить его в` / etc / shells` Ben Marten 6 лет назад 1
Чтобы полностью имитировать запуск рыбы напрямую, `fish" $ @ "` следует заменить на `exec -l fish" $ @ "`. exec заменяет процесс bash на fish, тогда как `-l` приводит к тому, что argv [0]` для fish равно `-fish`, что означает, что это оболочка входа в систему. azag0 6 лет назад 1
Обычно в этом нет ничего сложного, но, похоже, у этого недостатка есть недостаток, заключающийся в том, что когда неявно создается подоболочка, сначала всегда будет запускаться ненужный экземпляр bash. (Примечание: `~ / .profile` относится только к оболочкам входа в систему.) Тем не менее, голосование все еще поддерживается за его хороший компромисс между простотой и хакерством. (Лично я все же предпочел бы немного подправить свои скрипты конфигурации оболочки, так как давно уже отказался от сложных, в пользу пользовательских независимых от оболочки методов.) Sz. 5 лет назад 0
@Sz. Ну нету. Рыба не поддерживает подоболочки в первую очередь. И даже если бы он это сделал, он не сделал бы этого, выполнив вашу оболочку входа в систему, так что никакой Bash тогда не был бы создан. Noé Rubinstein 5 лет назад 1
ОК, спасибо за разъяснения! Sz. 5 лет назад 0
14
Albert

Мое текущее решение (см. Здесь, возможно, более свежую версию):

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 
Вы можете объяснить, что это делает? max pleaner 7 лет назад 3
@maxpleaner AFAICT просматривает .profile для операторов экспорта и выполняет их как наборы рыб. Это вроде нахально, но умно. Jared Smith 5 лет назад 0
7
jgillich

Для более чистого решения вы можете использовать внешний плагин env :

fenv source ~/.profile 
Это должно быть принятым решением. Вы могли бы уточнить (установить OMF) Jules Randolph 6 лет назад 3
3
Eswar Rajesh Pinapala

I tried sourcing .profile on fish startup and it worked like a charm for me.

just do :

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

Restart terminal or iterm2, test an alias from .profile to test.

Note : Won't work with more complex .profile files that use syntax not available in fish - credit @erb

У меня тоже сработало! Запуск MacOSX. Alexar 8 лет назад 0
Не будет работать с более сложными файлами `.profile`, которые используют синтаксис, недоступный в fish. erb 7 лет назад 0
@erb Я согласен с тобой, я добавил оговорку в ответ. Eswar Rajesh Pinapala 7 лет назад 1
2
Yegorius

Install dash and add this line to your 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 
1
Spiff

Ты не можешь fishсинтаксис слишком отличается от /bin/shсинтаксиса Bourne shell ( ). Это та же самая причина, которую вы не можете использовать .profileс другими оболочками, не производными от Борна, такими как cshи tcsh.

Я не хочу полностью выполнять `.profile`. Я просто хочу получить все "экспорт" оттуда. Одним простым способом было бы `egrep" ^ export "`, что было бы достаточно для меня. Другое, более правильное решение было бы [это] (http://superuser.com/questions/446929/run-any-shell-script-from-fish-and-import-all-exported-env-variables). Кроме того, я, например, мог бы запустить этот скрипт `import_bash_settings.py`, который, вероятно, делает что-то подобное. Таким образом, существует множество способов сделать это. С моим вопросом здесь мне было интересно, как другие решили это. Albert 11 лет назад 0
1
kzh

If your distribution uses PAM, you could set your environment variables in your ~/.pam_environment file.

1
cmey

You can start Fish from Bash. If you do that, Fish will inherit all environment variables (export FOO=bar) from Bash. At this point, Bash will have already read your .profile (or the like).

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

Почему бы вам просто не вставить config.fishэто:

bass source ~/.profile 

bass плагин для выполнения команд bash в fish

Похожие вопросы