Aqui está uma solução inteligente de uma linha que faz todas as coisas certas: remove duplicatas, preserva a ordem dos caminhos e não adiciona dois pontos no final. Portanto, ele deve fornecer um caminho deduplicado que oferece exatamente o mesmo comportamento que o original:
PATH="$(perl -e 'print join(":", grep { not $seen{$_}++ } split(/:/, $ENV{PATH}))')"
Simplesmente divide em dois pontos ( split(/:/, $ENV{PATH})
), usa usos grep { not $seen{$_}++ }
para filtrar quaisquer instâncias repetidas de caminhos, exceto a primeira ocorrência, e depois junta as demais, separadas por dois pontos e imprime o resultado ( print join(":", ...)
).
Se você quiser um pouco mais de estrutura em torno dele, bem como a capacidade de deduplicar outras variáveis também, tente este snippet, que estou usando atualmente em minha própria configuração:
# Deduplicate path variables
get_var () {
eval 'printf "%s\n" "${'"$1"'}"'
}
set_var () {
eval "$1=\"\$2\""
}
dedup_pathvar () {
pathvar_name="$1"
pathvar_value="$(get_var "$pathvar_name")"
deduped_path="$(perl -e 'print join(":",grep { not $seen{$_}++ } split(/:/, $ARGV[0]))' "$pathvar_value")"
set_var "$pathvar_name" "$deduped_path"
}
dedup_pathvar PATH
dedup_pathvar MANPATH
Esse código deduplicará PATH e MANPATH, e você poderá facilmente chamar dedup_pathvar
outras variáveis que contêm listas de caminhos separados por dois pontos (por exemplo, PYTHONPATH).