Я используют следующие (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 удалены.
Вам придется приспособить это к оболочке C (извините, но я очень верю в истины, провозглашенные в C Shell Programming Considered Harmful). В первую очередь вам не придется возиться с сепаратором двоеточия, поэтому жизнь на самом деле проще.
Связанные (хотя в основном ответы на борновские оболочки): http://stackoverflow.com/questions/273909/how-do-i-manipulate-path-elements-in-shell-scripts – dmckee 2009-12-22 14:05:28
Вы должны опубликовать свой метод как отдельный ответ, не как вопрос редактирование. – 2013-01-02 19:29:48