`setx` эквивалент в Ubuntu

9

В Windows есть команда powershell, setxкоторая называется, которая создает или изменяет переменные среды в пользовательской или системной среде.

Есть ли в Ubuntu аналогичная команда, т. Е. Не с помощью nanoили vi, всего одна строка для добавления или обновления переменной среды в масштабе всей системы.

Внедренное решение

Одна строка для добавления / обновления

grep env_name /etc/environment && sed -i.bak 's/env_name=.*/env_name="env_value"/' /etc/environment || echo 'env_name="env_value"' >> /etc/environment
Айман
источник

Ответы:

12

Вы можете сделать это, просто объявив его как новый в командной строке или повторно объявив его. Например, если вы хотите добавить ~/testfolderк своей переменной path, вы можете просто ввести ее в свой текущий терминал (это только пример):

PATH="$HOME/testfolder:$PATH"

Это, конечно, изменит его только на время, когда вы сказали, что терминальная сессия открыта. Обратите внимание на $использование здесь, вы оставляете его для объявления, но если вы хотите отобразить его, вам нужно добавить его, $чтобы расширить его содержимое.

Если вы хотите объявить их более продолжительными и общими, вы можете добавить их в свой ~/.bashrc(только для вас) файл или в /etc/bash.bashrc(в масштабе всей системы), например, если вы хотите, чтобы они учитывались только для вас или для всех пользователей. Другой вариант - добавить его в свой .profileфайл (только для себя), где он будет жизнеспособным с момента входа в систему. Это можно сделать, echoнапример, если вы уверены, что эта переменная еще не установлена ​​или если вы создаете новые (только пример):

echo "variable=value" >> /path/filename

Однако если вы хотите отредактировать файл за пределами своего пользовательского каталога, то есть тот случай, когда вы хотите отредактировать /etc/bash.bashrcего, sudoпоэтому вам нужно просто использовать «здесь документ», так как это не сработает, вместо этого используйте строку, как показано ниже:

echo "variable=value" | sudo tee -a /path/filename

Если переменная уже существует, вы можете изменить ее с помощью sedкоманды (также только в качестве примера):

sed -i.bak 's/variable=value/variable=new-value/' /path/filename

Это отредактирует переменную в файле, но создаст ее резервную копию до редактирования. Если вы изменяете файлы вне вашей пользовательской директории с помощью sed, вам нужно использовать их sudoв большинстве случаев, поэтому строка будет выглядеть так:

sudo sed -i.bak 's/variable=value/variable=new-value/' /path/filename

Удаление переменной из файла также может быть сделано sed, просто оставьте вторую часть регулярного выражения пустой:

sed -i.bak 's/variable=value//' /path/filename

Если вас интересует, какие переменные среды установлены, вы можете использовать envкоманду для их перечисления ( set -o posix ; set ) | lessили sh -c set. Все три дают различное количество продукции, ( set -o posix ; set ) | lessвозвращая большинство переменных, которые фактически установлены.

Videonauth
источник
1
Вместо ( set -o posix ; set )этого проще сказать sh -c set. Это будет работать, даже если shэто символическая ссылка bash(что обычно не в современных версиях Ubuntu).
Руслан
@ruslan sh -c setне показывает все переменные среды, установленные в системе. Однако я включу это как третий способ показать некоторые из них.
Видеонавт
На самом деле sh -c setпоказывает все переменные среды . Он просто не показывает переменные оболочки вызывающей оболочки, но они никогда не наследуются процессом, который вы запускаете из этой оболочки, если только вы не используете exportих.
Руслан
Есть ли когда - нибудь веская причина для редактирования /etc/environment? Похоже, это путь к путанице.
Роджер Липскомб
@RogerLipscombe Спасибо, не был уверен в этом, это все еще жизнеспособное место для редактирования переменных, но я взял его, чтобы не вызвать путаницу.
Видеонавт
11

Прямого эквивалента нет setx /m, но есть способы добиться того, что setx /mделает.

setx /mставит variable=valueв HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment. Non- / м (то есть для каждого пользователя) setxпросто ставит variable=valueв HKCU\Environment.

Вы специально просили «всей системы». Для этого вы бы добавили пару переменная-значение либо в /etc/environmentOR /etc/profile.d/<yourfile>. Первый оценивается с помощью pam, а второй - с помощью /bin/sh. Таким образом, в /etc/profile.d/<yourfile>, вы бы добавили variable=value; export variable. (Баш также позволяет export variable=value). Ибо /etc/environmentты бы добавил variable=value.

Эквивалентами для каждого пользователя являются ~/.pam_environmentи ~/.profile.

Смотрите также: https://help.ubuntu.com/community/EnvironmentVariables

Сайрус Патель
источник
7

Вы можете экспортировать переменные среды в командной строке, но это не повлияет на эффективную среду в уже запущенных процессах, только в текущем процессе и его подпроцессах. Поэтому на практике вам часто нужно повторно регистрироваться при изменении переменных среды.

Гуннар Хьялмарссон
источник