Переменные среды Path. Переменные среды Path Добавить в переменную среды path linux

03.02.2023 Фотошоп

export PATH=~/opt/bin:$PATH

Export PATH=$PATH:~/opt/bin

9 Solutions collect form web for “Как правильно добавить путь к PATH?”

Простые вещи

PATH=$PATH:~/opt/bin PATH=~/opt/bin:$PATH

в зависимости от того, хотите ли вы добавить ~/opt/bin в конце (для поиска по всем другим каталогам, если есть программа с тем же именем в нескольких каталогах) или в начале (для поиска перед всеми другими каталогами).

Вы можете добавить несколько записей одновременно. PATH=$PATH:~/opt/bin:~/opt/node/bin или изменения в порядке упорядочения просто отлично.

Вам не нужно export если переменная уже находится в среде: любое изменение значения переменной отражается в среде PATH почти всегда находится в среде; все системы unix устанавливают его очень рано (обычно в самом первом процессе, по сути).

Если ваш PATH будет построен в разных компонентах, вы можете получить дубликаты записей. См. Как добавить путь к исходному каталогу, который будет обнаружен Unix, какая команда? и удалите повторяющиеся записи $ PATH с помощью команды awk, чтобы избежать добавления дубликатов или их удаления.

Где поставить

Обратите внимание, что ~/.bash_rc не читается какой-либо программой, а ~/.bashrc – это файл конфигурации интерактивных экземпляров bash. Вы не должны определять переменные среды в ~/.bashrc . Правильное место для определения переменных среды, таких как PATH равно ~/.profile (или ~/.bash_profile если вам не нужны оболочки, отличные от bash). Посмотрите, в чем разница между ними и какой из них я должен использовать?

Заметки о оболочках, отличных от bash

В bash, ksh и zsh, export является специальным синтаксисом, и оба PATH=~/opt/bin:$PATH и export PATH=~/opt/bin:$PATH делают все правильно. В других оболочках Bourne / POSIX, таких как тире (которые есть /bin/sh во многих системах), export анализируется как обычная команда, что подразумевает две отличия:

  • ~ анализируется только в начале слова, за исключением назначений (см. раздел «Как добавить путь к исходному каталогу, который будет обнаружен Unix, какая команда?»).
  • $PATH вне двойных кавычек ломается, если PATH содержит пробелы или \[*? ,

Таким образом, в оболочках, подобных тире, export PATH=~/opt/bin:$PATH устанавливает PATH в литеральную строку ~/opt/bin/: за ней следует значение PATH до первого места. PATH=~/opt/bin:$PATH (нечеткое задание) не требует кавычек и делает правильные вещи. Если вы хотите использовать export в переносном скрипте, вам нужно написать export PATH="$HOME/opt/bin:$PATH" .

¹ Это было неверно в ракетах Борна (как в реальной оболочке Борна, не в современных оболочках в стиле POSIX), но вы вряд ли столкнетесь с такими старыми оболочками в наши дни.

В любом случае это работает, но они не делают то же самое: элементы PATH проверяются слева направо. В первом примере исполняемые файлы в ~/opt/bin будут иметь приоритет над установленными, например, в /usr/bin , что может быть или не быть тем, что вы хотите.

В частности, с точки зрения безопасности, опасно добавлять пути к фронту, потому что, если кто-то может получить доступ на запись к вашему ~/opt/bin , они могут, например, разместить другие ls , которые вы "d, то, вероятно, используйте вместо /bin/ls не заметив. Теперь представьте себе то же, что и для ssh или вашего браузера или выбора … (То же самое можно сделать трижды на вашем пути.)

Меня смущает вопрос 2 (поскольку он был удален из вопроса, поскольку он был связан с проблемой, не связанной с ней):

Каков эффективный способ добавления дополнительных путей в разные строки? Первоначально я думал, что это может сделать трюк:

Export PATH=$PATH:~/opt/bin export PATH=$PATH:~/opt/node/bin

но это происходит не потому, что второе назначение не только добавляет ~/opt/node/bin , но и все ранее назначенные PATH .

Это возможное решение:

Export PATH=$PATH:~/opt/bin:~/opt/node/bin

но для удобства чтения я предпочел бы иметь одно назначение для одного пути.

Если вы говорите

PATH=~/opt/bin

это все, что будет в вашем PATH. PATH – это просто переменная среды, и если вы хотите добавить в PATH, вам нужно перестроить переменную именно с нужным содержимым. То есть то, что вы даете в качестве примера на вопрос 2, – это именно то, что вы хотите сделать, если я полностью не упущу точку вопроса.

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

Export PATH=/opt/bin:/usr/local/bin:/usr/contrib/bin:/bin:/usr/bin:/usr/sbin:/usr/bin/X11 # add optional items to the path for bindir in $HOME/local/bin $HOME/bin; do if [ -d $bindir ]; then PATH=$PATH:${bindir} fi done

Linux определяет исполняемый путь поиска с $PATH среды $PATH . Чтобы добавить каталог / данные / myscripts в начало $PATH среды $PATH , используйте следующее:

PATH=/data/myscripts:$PATH

Чтобы добавить этот каталог в конец пути, используйте следующую команду:

PATH=$PATH:/data/myscripts

Но предыдущие недостаточно, потому что, когда вы устанавливаете переменную среды внутри скрипта, это изменение действует только внутри скрипта. Это ограничение ограничено только двумя способами:

  • Если в сценарии вы экспортируете переменную окружения, она эффективна в рамках любых программ, вызываемых скриптом. Обратите внимание, что это не эффективно в программе, которая называется скриптом.
  • Если программа, вызывающая сценарий, делает это путем включения вместо вызова, любые изменения среды в скрипте эффективны в вызывающей программе. Такое включение может быть выполнено с помощью команды dot или команды source.

$HOME/myscript.sh source $HOME/myscript.sh

Включение в основном включает «вызываемый» скрипт в сценарии «вызова». Это похоже на #include в C. Таким образом, он эффективен внутри скрипта или программы вызова. Но, конечно, это не эффективно для любых программ или скриптов, вызываемых вызывающей программой. Чтобы сделать его эффективным вплоть до цепочки вызовов, вы должны следовать настройке переменной среды с помощью команды export.

В качестве примера, программа оболочки bash включает в себя содержимое файла.bash_profile по включению. Итак, добавив следующие 2 строки в.bash_profile:

PATH=$PATH:/data/myscripts export PATH

эффективно помещает эти 2 строки кода в программу bash. Таким образом, в bash переменная $ PATH включает $HOME/myscript.sh , и из-за инструкции экспорта любые программы, вызываемые bash, имеют измененную $PATH . И поскольку любые программы, запускаемые из приглашения bash, вызывается bash, новый путь действует для всего, что вы запускаете из подсказки bash.

Суть в том, что для добавления нового каталога в путь вам необходимо добавить или добавить каталог в переменную среды $ PATH в скрипте, включенном в оболочку, и вы должны экспортировать $PATH среды $PATH .

Дополнительная информация здесь

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

pathadd принимает один аргумент пути и необязательный аргумент after который, если он будет добавлен, добавится к PATH иначе он добавит его.

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

Pathadd() { newelement=${1%/} if [ -d "$1" ] && ! echo $PATH | grep -E -q "(^|:)$newelement($|:)" ; then if [ "$2" = "after" ] ; then PATH="$PATH:$newelement" else PATH="$newelement:$PATH" fi fi } pathrm() { PATH="$(echo $PATH | sed -e "s;\(^\|:\)${1%/}\(:\|\$\);\1\2;g" -e "s;^:\|:$;;g" -e "s;::;:;g")" }

Поместите их в любой скрипт, который вы хотите изменить среду PATH, и теперь можете это сделать.

Pathadd "/foo/bar" pathadd "/baz/bat" after export PATH

Вам гарантировано не добавлять к пути, если он уже существует. Если вы теперь хотите, чтобы /baz/bat был на старте.

Pathrm "/baz/bat" pathadd "/baz/bat" export PATH

Теперь любой путь можно перенести на передний план, если он уже находится на пути без удвоения.

Я не могу говорить о других дистрибутивах, но у Ubuntu есть файл, / etc / environment, который является стандартным поисковым путем для всех пользователей. Поскольку мой компьютер используется только мной, я помещаю любые каталоги, которые я хочу на моем пути, если только это временное дополнение, которое я ввел в сценарий.

Вот мое решение:

PATH=$(echo -n $PATH | awk -v RS=: -v ORS=: "!x[$0]++" | sed "s/\(.*\).\{1\}/\1/")

Хороший легкий лайнер, который не оставляет трейлинг:

Для меня (в Mac OS X 10.9.5) добавление имени пути (например, /mypathname) в файл /etc/paths очень хорошо работало.

Перед редактированием возвращается echo $PATH:

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

После редактирования /etc/paths и перезапуска оболочки переменная $ PATH добавляется с /pathname . Действительно, echo $PATH возвращает:

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/mypathname

Случилось так, что /mypathname добавлено в $PATH .

Чтобы добавить новый путь к PATH среды PATH:

Export PATH=$PATH:/new-path/

Чтобы это изменение применялось к каждой открытой оболочке, добавьте ее в файл, который будет вызываться оболочкой при ее вызове. В разных оболочках это может быть:

  • Bash Shell: ~ / .bash_profile, ~ / .bashrc или профиль
  • Korn Shell: ~ / .kshrc или.profile
  • Z Shell: ~ / .zshrc или.zprofile

например

# export PATH=$PATH:/root/learning/bin/ # source ~/.bashrc # echo $PATH

Вы можете увидеть предоставленный путь в вышеупомянутом выходе.

Переменные окружения в Linux - это специальные переменные, определенные оболочкой и используемые программами во время выполнения. Они могут определяться системой и пользователем. Системные переменные окружения Linux определяются системой и используются программами системного уровня.

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

Если смотреть более широко, переменная окружения может быть трех типов:

1. Локальные переменные окружения

Эти переменные определены только для текущей сессии. Они будут безвозвратно стерты после завершения сессии, будь то удаленный доступ или эмулятор терминала. Они не хранятся ни в каких файлах, а создаются и удаляются с помощью специальных команд.

2. Пользовательские переменные оболочки

Эти переменные оболочки в Linux определяются для конкретного пользователя и загружаются каждый раз когда он входит в систему при помощи локального терминала, или же подключается удаленно. Такие переменные, как правило, хранятся в файлах конфигурации: .bashrc, .bash_profile, .bash_login, .profile или в других файлах, размещенных в директории пользователя.

3. Системные переменные окружения

Эти переменные доступны во всей системе, для всех пользователей. Они загружаются при старте системы из системных файлов конфигурации: /etc/environment, /etc/profile, /etc/profile.d/ /etc/bash.bashrc.

Конфигурационные файлы переменных окружения Linux

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

.bashrc

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

.bash_profile

Эти переменные вступают в силу каждый раз когда пользователь подключается удаленно по SSH. Если этот файл отсутствует система будет искать.bash_login или.profile.

/etc/environment

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

/etc/bash.bashrc

Системный bashrc. Этот файл выполняется для каждого пользователя, каждый раз когда он создает новую терминальную сессию. Это работает только для локальных пользователей, при подключении через интернет, такие переменные не будут видны.

/etc/profile

Системный файл profile. Все переменные из этого файла, доступны любому пользователю в системе, только если он вошел удаленно. Но они не будут доступны, при создании локальной терминальной сессии, то есть если вы просто откроете терминал.

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

source имя_файла

Добавление пользовательских и системных переменных окружения в Linux

Теперь, когда вы знаете немного теории, перейдем к практике. Локальные переменные окружения в Linux можно создавать следующими командами:

var=значение
$ export var=значение

Эти переменные будут доступны только для текущей терминальной сессии.

Для удаления переменных окружения можно использовать несколько команд:

1. Использование env

По умолчанию с помощью env можно посмотреть все установленные переменные среды. Но с опцией -i она позволяет временно удалить все переменные оболочки и выполнить команду без переменных.

env –i команда

Var - это любая переменная, которую вы хотите передать этой команде.

Такая команда запустит оболочку вообще без переменных окружения:

После запуска такого окружения, не будет доступно никаких переменных, но после выхода все вернется на свои места.

2. Использование unset

Это другой способ удаления переменных окружения Linux. Unset удаляет переменную по имени до конца текущей сессии:

unset имя_переменной

3. Установить значение переменной в ""

Это самый простой способ удаления переменных окружения в Linux, устанавливая пустое значение переменной, вы удаляете ее до конца текущей сессии.

Замечание: С помощью таких способов вы можете изменять значения системных или пользовательских переменных, но они будут актуальны только для текущего сеанса.

Создание пользовательских и системных переменных окружения

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

1. Устанавливаем и удаляем локальные переменные в Linux

Давайте создадим локальную переменную VAR и установим ей любое значение, затем удалим ее с помощью unset и убедимся что она удалена:

VAR1="Losst"
$ echo $VAR1
$ unset VAR1
$ echo $VAR1

Другой способ создать переменную - команда export. Удалим ее присвоив пустое значение:

export VAR="Losst"
$ echo $VAR
$ VAR=
$ echo $VAR

Теперь создадим переменную VAR2 также зададим ей значение. А потом временно удалим все локальные переменные выполнив env -i. Она запустит оболочку без каких-либо переменных. После ввода exit все переменные будут восстановлены.

VAR2="Losst"
$ echo $VAR2
$ env -i bash
$ echo $VAR2

Установка и удаление пользовательских переменных

Отредактируйте файл.bashrc, в вашей домашней директории, добавив команду export, для экспортирования нужной переменной. Затем выполните команду source для применения изменений. Создадим, например, переменную CD:

Добавьте такую строчку (o, затем вставить, затем Esc и:wq):

export CD="This is Losst Home"

Теперь осталось обновить конфигурацию:

source .bashrc
$ echo $CD

Для удаления этой переменной просто удалите ее из.bashrc.

Теперь добавим переменную окружения с помощью.bash_profile. Эта переменная, как вы уже знаете будет доступна только при удаленном входе:

vi .bash_profile

Добавьте строчку:

export VAR2="This is Losst Home"

И выполните эти команды, чтобы применить изменения и проверить добавление переменной:

source .bash_profile
$ echo $VAR2

Переменная недоступна, так как вы создали локальную терминальную сессию, теперь подключитесь по ssh:

ssh user@localhost
$ echo $VAR2

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

Замечание: Эти переменные доступны всегда, но не для всех пользователей.

Установка и удаление системных переменных окружения

Создадим переменную, доступную для всех пользователей, во всех терминальных сессиях, кроме удаленных, добавлением ее в /etc/bash.profile:

vi /etc/bash.profile

export VAR="This is system-wide variable"

Затем обновляем:

source /etc/bash.bashrc

Теперь эта переменная доступна для всех пользователей, во всех терминалах:

echo $VAR
$ sudo su
$ echo $VAR
$ su -
$ echo $VAR

Если вы хотите сделать переменную окружения доступной для всех пользователей, которые подключаются к этой машине удаленно, отредактируйте файл /etc/profile:

export VAR1="This is system-wide variable for only remote sessions"

Обновите конфигурацию, и проверьте доступность переменной, она будет доступна только удаленно:

source /etc/profile
$ echo $VAR1

Если нужно добавить переменную окружения в Linux, так чтобы она была доступна и удаленно, и для локальных сессий, экспортируйте ее в /etc/environment:

vi /etc/environment

export VAR12="I am available everywhere"

Проверяем:

source /etc/environment
$ echo $VAR12
$ sudo su
$ echo $VAR12
$ exit
$ ssh localhost
$ echo $VAR12

Переменные окружения (environment variable ) используются для хранения общих значений переменных в пределах разных сценариев и программ. Такие переменные можно устанавливать на время, например на период работы конкретной оболочки терминала, или на период сессии пользователя, либо же установить переменную окружения на глобальном уровне - для всей системы.

Переменные окружения

$HOME
Переменная содержит путь к домашнему каталогу текущего пользователя. $USER
Имя текущего пользователя $PATH
Список каталогов для поиска оболочкой исполняемых программ. $PWD
Путь к текущему рабочему каталогу (либо pwd ). Пример: dir_path=$(pwd) . $SHELL
Интерпретатор по умолчанию $RANDOM
Генерирует рандомное число 0..32767 при каждом доступе к переменной. $SECONDS
Время в сек. с момента запуска командной оболочки. $? Результат выполнения предыдущей команды. $HOSTNAME
Имя компьютера $HISTFILE
Путь к файлу истории интерпретатора $IFS
Список символов-разделителей команд, параметров, элементов массива (по умолчанию: пробел, таб, новая строка) $PS1
Шаблон строки приглашения интерпретатора.

Временная установка переменной окружения

Установка переменной окружения на период сессии:

# Для нового процесса env имя_переменной=значение [команда] # Для текущей оболочки и всех ее подпроцессов export имя_переменной=значение [команда]

Значение переменной сохраняется до перезагрузки системы.

Установка постоянного значения

Переменные окружения на уровне системы устанавливаются через файл /etc/environment:

ENVIRONMENT="dev"

Установка переменной окружения для конкретного пользователя через файл ~/ .bashrc или ~/.bash_profile:

PATH="${PATH}:/home/user/bin:"

Внимание!

Файл ~/.bash_profile будет выполнен при запуске интерпретатора с ключом -l. При локальном входе этот файл не читается!

Также нужно помнить, что изменения вступят в силу только после перезагрузки сеанса!

Просмотр значения переменной окружения

Для просмотра значения переменной окружения есть команда printenv:

Printenv <имя_переменной>

#shell, #bash, #environment

К огда вы вводите команду в командной строке, вы в основном говорите оболочке запустить исполняемый файл с заданным именем. В Linux эти исполняемые программы, как ls, find, file и другие, как правило, живут в нескольких разных каталогов в вашей системе. Любой файл с исполняемыми разрешениями, хранящимися в этих каталогах, может быть запущен из любого места. Наиболее распространенные каталоги, которые содержат исполняемые программы /bin, /sbin, /usr/sbin, /usr/local/bin и /usr/local/sbin.

Но как оболочка узнает, в каких каталогах искать исполняемые программы или оболочка выполняет поиск по всей файловой системе?

Ответ прост. Когда вы вводите команду, оболочка ищет во всех каталогах, указанных в пользовательской переменной $PATH, исполняемый файл с таким именем.

В этой статье показано, как добавить каталоги в вашей переменной $PATH системы .

Что есть $PATHв Linux

Переменная окружающей среды $PATH является двоеточиями список каталогов, сообщает оболочке, какие каталоги для поиска исполняемых файлов.

Чтобы проверить, какие каталоги у вас есть в переменной $PATH, вы можете использовать команду printenv или echo:

Echo $PATH

Вывод будет выглядеть примерно так:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

Если у вас есть два исполняемых файла с одинаковым именем, расположенные в двух разных каталогах, оболочка запустит файл, который находится в каталоге, который стоит первым в $PATH.

Добавление каталога в ваш $PATH

Есть ситуации, когда вы можете захотеть добавить другие каталоги в переменную $PATH. Например, некоторые программы могут быть установлены в разных местах, или вы можете захотеть иметь выделенный каталог для ваших личных записей, но сможете запускать их без указания абсолютного пути к исполняемым файлам. Для этого вам просто нужно добавить каталог в свой $PATH.

Допустим, у вас есть каталог с именем, binрасположенный в вашем домашнем каталоге, в котором вы храните свои сценарии оболочки. Чтобы добавить каталог к ​​вашей переменной $PATH:

Команда export экспортирует измененную переменную в дочерние среды процессов оболочки.

Теперь вы можете запускать ваши скрипты, просто набрав имя исполняемого скрипта без указания полного пути к исполняемому файлу.

Однако это изменение носит временный характер и действует только в текущем сеансе оболочки.

Чтобы сделать изменение постоянным, вам нужно определить переменную $PATH в файлах конфигурации оболочки. В большинстве дистрибутивов Linux при запуске нового сеанса переменные среды считываются из следующих файлов:

  • Конфигурационные файлы глобальной оболочки, такие как /etc/environment и /etc/profile. Используйте этот файл, если вы хотите, чтобы новый каталог был добавлен всем системным пользователям $PATH.
  • Конфигурационные файлы для отдельных пользовательских оболочек. Например, если вы используете Bash, вы можете установить переменную $PATH в файле ~/.bashrc, а если вы используете Zsh – имя файла ~/.zshrc.

В этом примере мы установим переменную в файле ~/.bashrc. Откройте файл в текстовом редакторе и добавьте в конце следующую строку:

Nano ~/.bashrc

Export PATH="$HOME/bin:$PATH"

Сохраните файл и загрузите новое значение $PATH в текущий сеанс оболочки, используя :

Source ~/.bashrc

Чтобы подтвердить, что каталог был успешно добавлен, напечатайте его значение $PATH, набрав:

Echo $PATH

Заключение

Добавить новые каталоги в вашу пользовательскую или глобальную переменную $PATH довольно просто. Это позволяет выполнять команды и сценарии, хранящиеся в нестандартных местах, без необходимости вводить полный путь к исполняемому файлу.

Те же инструкции применимы для любого дистрибутива Linux, включая , CentOS, RHEL, Debian и Linux Mint.

Не стесняйтесь оставлять комментарии, если у вас есть какие-либо вопросы.

Мне интересно, где новый путь должен быть добавлен в переменную среды PATH . Я знаю, что это может быть выполнено путем редактирования.bashrc (например), но неясно, как это сделать.

Таким образом:

Export PATH=~/opt/bin:$PATH

Export PATH=$PATH:~/opt/bin

11 ответов

Простой материал

PATH=$PATH:~/opt/bin PATH=~/opt/bin:$PATH

в зависимости от того, хотите ли вы добавить в конец код ~/opt/bin (для поиска по всем другим каталогам, если есть программа с тем же именем в нескольких каталогах) или в начало (для поиска перед всеми другими каталогами).

Вы можете добавить несколько записей одновременно. PATH=$PATH:~/opt/bin:~/opt/node/bin или изменения в порядке упорядочения просто отлично.

Вам не нужно export , если переменная уже находится в среде: любое изменение значения переменной отражается в среде.¹ PATH довольно много всегда в окружающей среде; все системы unix устанавливают его очень рано (обычно в самом первом процессе, фактически).

Если ваш PATH создается многими разными компонентами, вы можете получить дубликаты записей. См. Как добавить путь к домашней директории, который будет обнаружен Unix, который команду? и Удалите повторяющиеся записи $ PATH с помощью команды awk , чтобы избежать дублирования или удалить их.

Где поставить

Обратите внимание, что ~/.bash_rc не читается какой-либо программой, а ~/.bashrc - это файл конфигурации интерактивных экземпляров bash. Вы не должны определять переменные среды в ~/.bashrc . Правильное место для определения переменных среды, таких как PATH , это ~/.profile (или ~/.bash_profile , если вам не нравятся оболочки кроме bash). См. В чем разница между ними и какой из них я должен использовать?

Заметки о оболочках, отличных от bash

В bash, ksh и zsh, export - специальный синтаксис, и оба PATH=~/opt/bin:$PATH и export PATH=~/opt/bin:$PATH делать правильные вещи даже. В других оболочках Bourne /POSIX, таких как тире (который является /bin/sh на многих системах), export анализируется как обычная команда, что подразумевает две отличия:

  • ~ анализируется только в начале слова, кроме назначений (см. Как добавить путь к домашнему каталогу, который будет обнаружен Unix, для которого требуется команда? ;
  • $PATH внешние двойные кавычки breaks if PATH содержит пробелы или \[*? .

Итак, в оболочках, таких как тире, export PATH=~/opt/bin:$PATH устанавливает PATH в литеральную строку ~/opt/bin/: , за которым следует значение PATH до первого места. PATH=~/opt/bin:$PATH (простое назначение) не требует кавычек и делает все правильно. Если вы хотите использовать export в переносном скрипте, вам нужно написать export PATH="$HOME/opt/bin:$PATH" или PATH=~/opt/bin:$PATH export PATH (или PATH=$HOME/opt/bin:$PATH export PATH для переносимости даже для оболочки Bourne, которая не принимает export var=value и не делал расширения тильды).

¹ Это было неверно в оболочках Bourne (как в реальной оболочке Bourne, а не в современных оболочках в стиле POSIX), но вы вряд ли столкнетесь с такими старыми оболочками в наши дни. Суб>

В любом случае работает, но они не делают то же самое: элементы PATH проверяются слева направо. В первом примере исполняемые файлы в ~/opt/bin будут иметь приоритет над установленными, например, в /usr/bin , что может быть или не быть тем, что вы хотите.

В частности, с точки зрения безопасности опасно добавлять пути к фронту, потому что, если кто-то может получить доступ на запись к вашему ~/opt/bin , они могут поместить для например, другой ls , который вы, вероятно, будете использовать вместо /bin/ls , не заметив. Теперь представьте себе то же самое для ssh или вашего браузера или выбора... (То же самое в три раза поместить на ваш путь.)

Я запутался в вопросе 2 (поскольку он удален из вопроса, поскольку он был связан с не связанной проблемой):

Каков эффективный способ добавления дополнительных путей в разные строки? Первоначально я думал, что это может сделать трюк:

Export PATH=$PATH:~/opt/bin export PATH=$PATH:~/opt/node/bin

Но это не потому, что второе назначение не только добавляет ~/opt/node/bin , но также назначенный ранее PATH .

Это возможное обходное решение:

Export PATH=$PATH:~/opt/bin:~/opt/node/bin

Но для удобства чтения я предпочел бы иметь одно назначение для одного пути.

Если вы скажете

PATH=~/opt/bin

это all , которое будет в вашем PATH. PATH - это просто переменная среды, и если вы хотите добавить в PATH, вам нужно перестроить переменную именно с нужным содержимым. То есть то, что вы даете в качестве примера на вопрос 2, - это именно то, что вы хотите сделать, если я не полностью упустил точку вопроса.

Я использую обе формы в своем коде. У меня есть общий профиль, который я устанавливаю на каждую машину, на которой я работаю, которая выглядит так: для размещения потенциально пропавших каталогов:

Export PATH=/opt/bin:/usr/local/bin:/usr/contrib/bin:/bin:/usr/bin:/usr/sbin:/usr/bin/X11 # add optional items to the path for bindir in $HOME/local/bin $HOME/bin; do if [ -d $bindir ]; then PATH=$PATH:${bindir} fi done

Linux определяет исполняемый путь поиска с переменной окружения $PATH . Чтобы добавить каталог /данные /myscripts в начало переменной окружения $PATH , используйте следующее:

PATH=/data/myscripts:$PATH

Чтобы добавить этот каталог в конец пути, используйте следующую команду:

PATH=$PATH:/data/myscripts

Но предыдущие недостаточно, потому что, когда вы устанавливаете переменную среды внутри скрипта, это изменение действует только внутри скрипта. Это ограничение ограничено двумя способами:

  • Если внутри скрипта вы экспортируете переменную окружения, она эффективна в рамках любых программ, вызываемых скриптом. Обратите внимание, что это не эффективно в программе, которая вызвала сценарий.
  • Если программа, вызывающая сценарий, делает это путем включения вместо вызова, любые изменения среды в скрипте эффективны в вызывающей программе. Такое включение может быть выполнено с помощью команды dot или исходной команды.

$HOME/myscript.sh source $HOME/myscript.sh

Включение в основном включает «вызываемый» скрипт в сценарии «вызова». Это похоже на #include в C. Таким образом, он эффективен внутри скрипта или программы вызова. Но, конечно, это не эффективно для любых программ или скриптов, вызываемых вызывающей программой. Чтобы сделать его эффективным вплоть до цепочки вызовов, вы должны следовать настройке переменной среды с помощью команды export.

В качестве примера, программа оболочки bash включает в себя содержимое файла.bash_profile по включению. Итак, поместите следующие 2 строки в.bash_profile:

PATH=$PATH:/data/myscripts export PATH

эффективно помещает эти 2 строки кода в программу bash. Таким образом, в bash переменная $ PATH включает $HOME/myscript.sh , и из-за инструкции экспорта любые программы, вызываемые bash, имеют измененную переменную $PATH . И поскольку любые программы, которые вы запускаете из приглашения bash, вызываются bash, новый путь действует для всего, что вы запускаете из приглашения bash.

Суть в том, что для добавления нового каталога в путь вам необходимо добавить или добавить каталог в переменную среды $ PATH в скрипте, включенном в оболочку, и вы должны экспортировать $PATH переменная среды.

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

pathadd принимает один аргумент пути и необязательный аргумент after , который, если он будет добавлен, добавится к PATH , иначе он добавит его.

В любой ситуации, если вы добавляете путь, вы, вероятно, хотите переопределить все, что уже есть в пути, поэтому я предпочитаю добавлять по умолчанию.

Pathadd() { newelement=${1%/} if [ -d "$1" ] && ! echo $PATH | grep -E -q "(^|:)$newelement($|:)" ; then if [ "$2" = "after" ] ; then PATH="$PATH:$newelement" else PATH="$newelement:$PATH" fi fi } pathrm() { PATH="$(echo $PATH | sed -e "s;\(^\|:\)${1%/}\(:\|\$\);\1\2;g" -e "s;^:\|:$;;g" -e "s;::;:;g")" }

Поместите их в любой скрипт, который вы хотите изменить среду PATH, и теперь вы можете сделать.

Pathadd "/foo/bar" pathadd "/baz/bat" after export PATH

Вам гарантировано не добавлять путь, если он уже существует. Если вы хотите, чтобы в начале был запущен /baz/bat .

Pathrm "/baz/bat" pathadd "/baz/bat" export PATH

Теперь любой путь можно перемещать на передний план, если он уже находится на пути без удвоения.

Пуленепробиваемый способ добавления /предварительной подготовки

Существует множество соображений, связанных с выбором добавления и добавления. Многие из них описаны в других ответах, поэтому я не буду повторять их здесь.

Важным моментом является то, что даже если системные скрипты не используют это (интересно, почему) * 1 , пуленепробиваемый способ добавления пути (например, $HOME/bin) к переменной среды PATH

PATH="${PATH:+${PATH}:}$HOME/bin"

для добавления (вместо PATH="$PATH:$HOME/bin") и

PATH="$HOME/bin${PATH:+:${PATH}}"

для добавления (вместо PATH="$HOME/bin:$PATH")

Это позволяет избежать ложного ведущего /конечного двоеточия, когда $PATH изначально пуст, что может иметь нежелательные побочные эффекты и может стать кошмаром, неуловимо найти ( этот ответ вкратце рассматривает случай awk -way).

${parameter:+word}

Если параметр parameter имеет значение null или unset, ничего не заменяется, в противном случае заменяется слово word .

Таким образом, ${PATH:+${PATH}:} расширяется до: 1) ничего, если PATH имеет значение null или unset, 2) ${PATH}: , если установлен PATH .

Примечание . Это для bash.

* 1 Я только что нашел, что скрипты вроде devtoolset-6/enable действительно используют это, $ cat /opt/rh/devtoolset-6/enable # General environment variables export PATH=/opt/rh/devtoolset-6/root/usr/bin${PATH:+:${PATH}} ...

Я не могу говорить для других дистрибутивов, но у Ubuntu есть файл, /etc /environment, который является стандартным поисковым путем для всех пользователей. Поскольку мой компьютер используется только мной, я помещаю любые каталоги, которые я хочу на свой путь там, если это не временное дополнение, которое я ввел в скрипт.

Для меня (в Mac OS X 10.9.5) добавление имени пути (например, /mypathname) в файл /etc/paths работало очень хорошо.

Перед редактированием возвращается echo $PATH:

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

После редактирования /etc/paths и перезапуска оболочки переменная $ PATH добавляется с помощью /pathname . Действительно, echo $PATH возвращает:

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/mypathname

Случилось так, что /mypathname был добавлен в переменную $PATH .