Я использую следующий скрипт (Bourne / Korn / POSIX / Bash) большую часть десятилетия:
: "@(#)$Id: clnpath.sh,v 1.6 1999/06/08 23:34:07 jleffler Exp $"
#
# Print minimal version of $PATH, possibly removing some items
case $# in
0) chop=""; path=${PATH:?};;
1) chop=""; path=$1;;
2) chop=$2; path=$1;;
*) echo "Usage: `basename $0 .sh` [$PATH [remove:list]]" >&2
exit 1;;
esac
# Beware of the quotes in the assignment to chop!
echo "$path" |
${AWK:-awk} -F: '#
BEGIN { # Sort out which path components to omit
chop="'"$chop"'";
if (chop != "") nr = split(chop, remove); else nr = 0;
for (i = 1; i <= nr; i++)
omit[remove[i]] = 1;
}
{
for (i = 1; i <= NF; i++)
{
x=$i;
if (x == "") x = ".";
if (omit[x] == 0 && path[x]++ == 0)
{
output = output pad x;
pad = ":";
}
}
print output;
}'
В оболочке Korn я использую:
export PATH=$(clnpath /new/bin:/other/bin:$PATH /old/bin:/extra/bin)
Это оставляет меня с PATH, содержащей новые и другие каталоги bin впереди, плюс одну копию каждого имени каталога в значении основного пути, за исключением того, что старый и дополнительный каталоги bin удалили bin.
Вы должны будете адаптировать это для оболочки C (извините, но я верю в истины, изложенные в Программирование на языке C считается опасным ). Прежде всего вам не придется возиться с разделителем двоеточий, поэтому жизнь на самом деле проще.