tengo estado usando el siguiente secuencia de comandos (Bourne/Korn/POSIX/Bash) para la mayor parte de una década:
: "@(#)$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;
}'
En Korn shell, utilizo:
export PATH=$(clnpath /new/bin:/other/bin:$PATH /old/bin:/extra/bin)
Esto me deja con PATH que contiene los directorios nuevos y otros bin en la parte delantera, más una copia de cada nombre de directorio en el valor de la ruta principal, excepto que los directorios bin viejos y adicionales han eliminado bin.
Tendría que adaptar esto a C shell (lo siento, pero soy un gran creyente en las verdades enunciadas en C Shell Programming Considered Harmful). En primer lugar, no tendrá que jugar con el separador de colon, por lo que la vida es realmente más fácil.
Relacionados (aunque la mayoría de las respuestas de shell bourne): http://stackoverflow.com/questions/273909/how-do-i-manipulate-path-elements-in-shell-scripts – dmckee
Debería publicar su método como una tarea separada respuesta, no como una edición de pregunta. –