предотвратите дублирующиеся записи в $PATH

Регулярным способом добавить каталог для СОЕДИНЕНИЯ КАНАЛОМ:

PATH=$PATH:/new-directory

Теперь проблема состоит в том, если Вы добавите новый каталог к ПУТИ затем, то будет добавлено, не проверяя, находится ли это уже в ПУТИ или нет.

Например:

echo $PATH

дает:

/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Теперь, если я добавляю /usr/bin:

PATH=$PATH:/usr/bin

Затем ПУТЬ становится:

/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/bin

Так, если можно заметить, теперь /usr/bin повторяется.

Так, как я могу добавить новый каталог к ПУТИ без повторения?

1
задан 27 May 2015 в 10:16

3 ответа

Короткий путь состоит в том, чтобы использовать:

[[ ":$PATH:" =~ ":/new-directory:" ]] || PATH="/new-directory:$PATH"

Объяснения:

  • команда First, [[ условная команда, для теста.
  • =~ возврат бинарного оператора 0, если строка справа, которую считают расширенным регулярным выражением, соответствует строке слева, и 1 иначе.
  • , Если тест не , передал (/new-directory, был не найдены в ПУТИ), благодаря || логичный ИЛИ оператор управления, вторая команда выполняется: PATH="/new-directory:$PATH".

Наблюдения:

  • необходимо всегда использовать кавычки при присвоении строки переменной даже если строка является другой переменной: PATH="/new-directory:$PATH".
  • В целом лучше для добавления нового каталога к переменной окружения PATH впереди к каталогам других, не после: PATH="/new-directory:$PATH". Это, потому что каталоги в начале ПУТИ имеют приоритет по тем, которые приезжают позже.
4
ответ дан 3 December 2019 в 06:33

Можно использовать эту команду:

if [[ ":$PATH:" != *":/new-directory:"* ]]; then PATH=${PATH}:/new-directory; fi

Теперь для примера выше:

echo $PATH

дает:

/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Теперь, если я хочу добавить/usr/bin:

if [[ ":$PATH:" != *":/usr/bin:"* ]]; then PATH=${PATH}:/usr/bin; fi

можно заметить, что ПУТЬ не изменяется:

/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

теперь для добавления другого примера/var/www

if [[ ":$PATH:" != *":/var/www:"* ]]; then PATH=${PATH}:/var/www; fi

каталога Тогда вывод echo $PATH дает:

/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/var/www
1
ответ дан 3 December 2019 в 06:33

Я использую bash_path_funcs Stephen Collyer, описанный в Журнале Linux путь назад в 2000:

http://www2.linuxjournal.com/lj-issues/issue71/3645.html  
http://www2.linuxjournal.com/lj-issues/issue72/3768.html  
http://www2.linuxjournal.com/lj-issues/issue73/3935.html  

Эти addpath функция добавляет запись в путь, только если это не там во-первых. delpath -n удаляет все несуществующие каталоги из пути.

Мое плохое, я использовал ссылки в своем ответе, но ссылки сделали то, что они всегда делают - они ушли. Можно добраться pathfunc.tgz файл от https://web.archive.org/web/20061210054813/http://www.netspinner.co.uk:80/Downloads/pathfunc.tgz

1
ответ дан 3 December 2019 в 06:33

Другие вопросы по тегам:

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