Для Bash / ZSH у меня были ~/.profileнекоторые экспорты, псевдонимы и другие вещи.
Я не хочу иметь отдельную конфигурацию для переменных среды для Fish, я хочу повторно использовать мою ~/.profile. Как?
В FAQ указано, что я могу, по крайней мере, импортировать их через /usr/local/share/fish/tools/import_bash_settings.py, однако мне не очень нравится запускать их для каждого экземпляра Fish.
You can use Bash to parse /etc/profile and ~/.profile, and then start fish.
Create /usr/local/bin/fishlogin with contents
#!/bin/bash -l exec -l fish "$@"
Make it executable
sudo chmod +x /usr/local/bin/fishlogin
Add it to /etc/shells
echo /usr/local/bin/fishlogin | sudo tee -a /etc/shells
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.
Ты не можешь 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