Вещь перед обновлением в Fedora работает только приблизительно на 2 шага распределения, и это определенно не было доступно для Fedora 12. Ваш лучший выбор состоит в том, чтобы установить с нуля, Ваша система, вероятно, очень испорчена прямо сейчас.
Bash имеет специальный синтаксис для установки переменных среды, а рыба использует встроенный. Я бы предложил написать ваш файл .env, как так:
setenv VAR1 val1
setenv VAR2 val2
, а затем определяя SETENV
, соответствующим образом в соответствующих оболочках. В Bash (например .bashrc):
function setenv() { export "$1=$2"; }
. ~/.env
в рыбе (например, Config.fish):
function setenv; set -gx $argv; end
source ~/.env
Обратите внимание, что путь потребует некоторой специальной обработки, поскольку это массив в рыбе, но и никтоливая колонна в Bash. Если вы предпочитаете писать PATHING
SETENV PATH «$ HOURE / BIN: $ PATHION»
в .env, вы можете написать Fish Setenv вроде так:
function setenv
if [ $argv[1] = PATH ]
# Replace colons and spaces with newlines
set -gx PATH (echo $argv[2] | tr ': ' \n)
else
set -gx $argv
end
end
Это будет элементы Mishandle в пути, которые содержат пробелы, двоеты или Ньюлайн.
Неловкость в пути обусловлена смешиванием слоев разделите толщиной толстой кишки с помощью истинных массивов. Предпочтительный способ добавления к пути в рыбе просто SET PATH $ PATH ~ / BIN
.
Большинство Unix-систем используют PAM. Модуль pam_env
читает файл очень похожий на ваш .env
.
На Linux, pam_env
считывает системный файл /etc/environment
и пользовательский файл ~/.pam_environment
. В OS X (и других *BSD, которые также используют OpenPAM) оказывается, что pam_env
читает только системный файл, так что таким образом вы не можете установить переменные для каждого пользователя, только для всех пользователей.
Существует (сейчас?) Более простой способ, согласно ответу @Zanchey здесь
Fish Shell: Как установить несколько переменные среды из файла с использованием экспорта
Дайджест:
Fish:
echo -e "foo = 3 \ nfoobar = 4"> .env; экспорт (кат. env); env | grep foo
Bash:
echo -e "foo = 3 \ nfoobar = 4"> .env; экспорт $ (cat .env | xargs); env | grep foo
с той разницей, что $
и использование xargs
Расширяя ответ @ridiculous _fish, со следующей функцией для bash она также работает для массивов, содержащих пробелы, например $PATH
, если в ваших путях есть пробелы. Однако в настоящее время setenv
уже определена как функция в стандартной библиотеке рыбы, поэтому я изменил имя здесь наshenv
function shenv {
var="$1"
shift
export "$var=$(printf "%s\n" "$@" | paste -s -d: -)"
}
. ~/.env
Теперь в файле .env
можно указывать компоненты массива как отдельные аргументы команды setenv
:
shenv PATH /my/path /my/path\ with\ spaces "/my/quoted path" $PATH
Для рыбы @ridiculous _подойдет простая реализация рыбы:
function shenv; set -gx $argv; end
source ~/.env
Просто создайте функцию в $HOME/.config/fish/functions/env.fish с содержимым:
for f in /etc/profile.d/*.sh
sh $f
end
поделился всеми переменными, созданными в bash, в папке /etc/profile.d
например :/etc/profile.d/golang.sh
#!/bin/sh
export GOPATH=$HOME/gopath
export GOROOT=$HOME/go
export GOBIN=$HOME/gobin
export PATH=$PATH:$GOROOT/bin:$GOBIN
просто войдите в систему на fish или bash, выполните echo $GOPATH $GOROOT $GOBIN $PATH
и увидите волшебство:)
Если вы не возражаете против разветвления другого процесса, тогда:
env $(cat ~/.env) fish
Я использую этот способ, чтобы совместно использовать один и тот же .env
файл с несколькими оболочками в нескольких проектах. Синтаксис прост и достаточно гибок, так как вы можете exit
оболочке восстановить исходную среду.
Еще пример:
env $(cat.env) bash
env $(cat.env) zsh
env $(cat.env) sh
Одним из недостатков является то, что он предполагает .env
только в синтаксисе VAR=value
(без комментариев, новой строки или кавычек ).
Я предпочитаю .env
как можно проще называть переменные более осмысленными, вместо того чтобы писать много комментариев и новых строк. Однако, если в некоторых случаях невозможно избежать комментариев и символов новой строки, это все равно можно легко решить, направив вывод в grep
, sed
или awk
.
Извините, мое решение может не решить первоначальный вопрос из-за синтаксиса .env
, но я нашел его полезным для совместного использования одного и того же .env
с разными оболочками. Надеюсь, это поможет кому-нибудь из вас:)