Точно не ответ, но, возможно, полезный для других, у которых есть проблемы дублирования
Начиная с ответа на принятие, который я получил от переполнения стека: как мне манипулировать элементами $ PATH в сценариях оболочки? Я разработал немного большой набор инструментов. Большая часть заслуг здесь должна достаться Джонатану Леффлеру, который предоставил модель, которую я использовал при написании этих работ.
Добавить без дублирования
# Insure that a path element exists by adding it to the end if it does not
#
# $1 name of the shell variable to set (e.g. PATH)
# $3 the path element that we want to insure exists
function insure_path () {
local path=$1
local list=$(eval echo '$'$path)
local pat=$2
checkstr=$(echo "$list" | tr ":" "\n" | grep -Fm 1 "$pat")
if [ "$checkstr" ]
then
true
else
export $path=$(echo $list:$pat | sed -e 's|\(:\):*|\1|g' -e 's|:$||' -e'
s|^:||')
fi
}
# Insure that a path element exists by adding it to the front if it does not
#
# $1 name of the shell variable to set (e.g. PATH)
# $2 the path element that we want to insure exists
function insure_path_front () {
local path=$1
local list=$(eval echo '$'$path)
local pat=$2
checkstr=$(echo "$list" | tr ":" "\n" | grep -Fm 1 "$pat")
if [ $checkstr ]
then
true
else
export $path=$(echo $pat:$list | sed -e 's|\(:\):*|\1|g' -e 's|:$||' -e'
s|^:||')
fi
}
Удалить существующие дубликаты
# Remove duplicates from a path. Preferes the ealiest instance of each
# duplicate because this preserves the semantics of the existing path
#
# $1 name of the shell variable to set (e.g. PATH)
function unduplicate_path () {
local path=$1
local list=$(eval echo '$'$path)
local split_list=$(echo "$list" | tr ":" " ")
local tempp=""
# Build the new version of $path from scrath
for p in $split_list
do
insure_path_back tempp $p
done
# Now replace the existing version
export $path=$tempp
}