Переменные среды доли между ударом и рыбой

Вещь перед обновлением в Fedora работает только приблизительно на 2 шага распределения, и это определенно не было доступно для Fedora 12. Ваш лучший выбор состоит в том, чтобы установить с нуля, Ваша система, вероятно, очень испорчена прямо сейчас.

12
13.04.2017, 15:36
6 ответов

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 .

16
27.01.2020, 19:54

Большинство Unix-систем используют PAM. Модуль pam_env читает файл очень похожий на ваш .env.

На Linux, pam_env считывает системный файл /etc/environment и пользовательский файл ~/.pam_environment. В OS X (и других *BSD, которые также используют OpenPAM) оказывается, что pam_env читает только системный файл, так что таким образом вы не можете установить переменные для каждого пользователя, только для всех пользователей.

5
27.01.2020, 19:54

Существует (сейчас?) Более простой способ, согласно ответу @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

6
27.01.2020, 19:54

Расширяя ответ @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
1
27.01.2020, 19:54

Просто создайте функцию в $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и увидите волшебство:)

3
27.01.2020, 19:54

Если вы не возражаете против разветвления другого процесса, тогда:

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с разными оболочками. Надеюсь, это поможет кому-нибудь из вас:)

0
23.05.2020, 03:21

Теги

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