Решение - не такое элегантное, как те, которые изменяют переменные *RS, но, возможно, достаточно понятное:
PATH=`awk 'BEGIN {np="";split(ENVIRON["PATH"],p,":"); for(x=0;x<length(p);x++) { pe=p[x]; if(e[pe] != "") continue; e[pe] = pe; if(np != "") np=np ":"; np=np pe}} END { print np }' /dev/null`
Вся программа работает в блоках BEGIN и END. Он извлекает переменную PATH из среды, разбивая ее на единицы. Затем он переитерирует результирующий массив p (который создается по порядку split()
). Массив e является ассоциативным массивом, который используется для определения того, видели ли мы текущий элемент path (например, /usr/local/bin) ранее, а если нет, то добавляется к np, с логикой добавления двоеточия к np, если в np уже есть текст. Блок END просто повторяет np. Это можно было бы еще больше упростить, добавив флаг -F:
, исключив третий аргумент в split()
(как по умолчанию он используется в FS) и изменив np = np ":"
к np = np FS
, давая нам:
awk -F: 'BEGIN {np="";split(ENVIRON["PATH"],p); for(x=0;x<length(p);x++) { pe=p[x]; if(e[pe] != "") continue; e[pe] = pe; if(np != "") np=np FS; np=np pe}} END { print np }' /dev/null
Наивно, я полагал, что for(element in array)
сохранит порядок, но это не работает, поэтому мое оригинальное решение не работает, так как люди расстроятся, если кто-то вдруг скремблирует порядок их $PATH
:
awk 'BEGIN {np="";split(ENVIRON["PATH"],p,":"); for(x in p) { pe=p[x]; if(e[pe] != "") continue; e[pe] = pe; if(np != "") np=np ":"; np=np pe}} END { print np }' /dev/null
Исходный RPM (src.rpm) упакован с использованием формата RPM. Вы можете использовать это для создания двоичного пакета для своего компьютера или использовать его в качестве отправной точки для пользовательских версий. Исходные RPM немного более портативны, чем двоичные, но если вы не осведомлены, я бы не советовал идти по этому пути.
Проверьте страницы CentOS, посмотрите, доступны ли для вашей системы двоичные пакеты в виде официального пакета или в одном из проверенных сторонних репозиториев . Будьте осторожны, еще несколько теневых сторонних репозиториев перезаписывают основные пакеты и могут сломать вашу систему (или затруднить обновление).