Поділіться змінними середовища між басейном та рибою


13

скрипти bash та fish не сумісні, але я хотів би мати файл, який визначає деякі змінні середовища, які слід ініціалізувати як bash, так і рибами.

Моє запропоноване рішення - це визначити ~/.envфайл, який міститиме перелік змінних оточуючих середовищ на зразок:

PATH="$HOME/bin:$PATH"
FOO="bar"

Тоді я міг би просто запустити його в bash і зробити скрипт, який перетворює його у формат риби та джерела, що у рибі.

Я думав, що може бути краще рішення, ніж це, тому я прошу кращого способу обміну змінними середовища між рибами баш.

Примітка: я використовую OS X.


Ось .envфайл прикладу, який я хотів би, щоб і риба, і bash обробили, використовуючи синтаксис смішної риби (припустимо, що ~ / bin і ~ / bin2 є порожніми каталогами):

setenv _PATH "$PATH"
setenv PATH "$HOME/bin"
setenv PATH "$PATH:$HOME/bin2"
setenv PATH "$PATH:$_PATH"

Відповіді:


17

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

Зауважте, що PATH потребуватиме спеціального керування, оскільки це масив у рибі, а обмежений двокрапкою в bash. Якщо ви вважаєте за краще писати setenv PATH "$HOME/bin:$PATH"в .env, ви можете написати рибне 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

Це призведе до неправильного керування елементами PATH, які містять пробіли, колонки або нові рядки.

Незграбність у PATH обумовлена ​​змішуванням рядків, розділених товстою кишкою, з справжніми масивами. Кращий спосіб приєднання до PATH в рибі - це просто set PATH $PATH ~/bin.


1
Чи буде PATHвиправлення для риб працювати з доріжками з: пробілами? нові рядки? інші речі, на які слід звернути увагу?
Тіїло

[є вбудованим як у bash, так і в рибу, тому PATH не потрібно правильно встановлювати для використання [. Зразок setenv повинен працювати з усіма символами в PATH, за винятком колонок та нових рядків.
ridiculous_fish

Заміна trз /usr/bin/trI і використовуючи .envфайл , представлений в моєму питанні, я отримую багато помилок при запуску риби. Я не думаю, що обробка PATH є правильною.
Тіїло

О, так, риба буде простір-відокремлює її всередині лапок. Я оновлю коментар.
ridiculous_fish

Так, це працює і зараз. Я не думаю, що будь-яка інша оболонка (крім риби?) В будь-якому випадку не дозволяє стежки з колонами в PATH.
Тиїло

6

Тут (зараз?) Простіший спосіб, за відповідь @ Занчі тут

Fish Shell: Як встановити декілька змінних середовища з файлу за допомогою експорту

Дайджест, хоча:

Риба:

echo -e "foo=3\nfoobar=4" > .env; export (cat .env); env | grep foo

Bash:

echo -e "foo=3\nfoobar=4" > .env; export $(cat .env | xargs); env | grep foo

з різницею $і використаннямxargs


Набагато зручніше і без особливих синтаксисів. Дякую
Панайотис

Не працює для масивів, таких як $ PATH
JanKanis

5

Більшість систем Unix використовують PAM . pam_envМодуль зчитує файл дуже подобається ваш .env.

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


1

Розширюючись на відповідь @ 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_fish проста реалізація:

function shenv; set -gx $argv; end
source ~/.env

1

Просто створіть функцію в $ HOME / .config / fish / функции / 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

просто увійдіть у рибу чи баш, зробіть echo $GOPATH $GOROOT $GOBIN $PATHі побачите чари :)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.