Удалить несуществующие каталоги из переменной окружения `$ PATH` - PullRequest
0 голосов
/ 09 ноября 2018

Удаление несуществующих каталогов из переменной среды PATH, это удобный способ управления вашей переменной PATH. Вы добавляете все местоположения, которые могут когда-либо существовать, а затем удаляете все те, которые не существуют. Это гораздо сложнее, чем проверять наличие каталога после добавления.

Недавно я написал для этого функцию dash / bash, поэтому я решил поделиться ею, поскольку, очевидно, это нигде не было адресовано.

1 Ответ

0 голосов
/ 09 ноября 2018

path_checkdir

Этот код совместим с тире.

path_checkdir() {

    keep_="="
    remove_="_"

    help='
Usage: path_checkdir [-v] [-K =] [-R _] [-i $'\n']

    -i ignore_this_path
Accept the specified path without checking the existence of the directory.
/!\ Beware, specifying it more than once will overwrite the preceding value.
I use it to keep single newlines in my $PATH.

    -v
Tell which directories are kept and which are removed.

    -K marker_keep_path
    -R marker_remove_path
Replace the default values (= for -K and _ for -R) used by -v to tell what is
kept and what is removed.
'

    while [ $# -gt 0 ]
    do
        case "$1" in
        "-v") verbose=t;;
        "-i") shift; ignore="i$1";;
        "-K") shift; keep_="$1";;
        "-R") shift; remove_="$1";;
        "-h"|"--help") echo "$help"
        esac
        shift
    done

    # /!\ IFS characters are stripped when using `read`
    local oIFS="$IFS"
    IFS=''
    # /!\ Beware pipes. They imply subshells
    # The usuall alternative is to use process substitution, but it
    # won't work with dash, so I used file descriptor redirections
    # instead.
    {
    PATH="$(echo "$PATH" | {
    P=""
    while read -rd: dir
    do
        if [ "i$dir" = "$ignore" ] || [ -d "$dir" ]
        then
            # If -v is provided, be verbose about what is kept (=) and
            # what is removed (_).
            if [ $verbose ]
            then echo "$keep_$dir" >&3
            fi
            P="$P:$dir"
        else
            if [ $verbose ]
            then echo "$remove_$dir" >&3
            fi
        fi
    done
    echo "${P:1}"; })"
    } 3>&1
    IFS="$IFS"
}

Теперь еще многое нужно улучшить. Он принимает только одно исключение пути, в то время как было бы здорово принять любое число и, вероятно, также поддерживать шаблоны подстановочных знаков. Более важно, если некоторые пути $PATH содержат ~, они не будут правильно интерпретированы и будут удалены. Я не уверен, что все расширения оболочки сделаны для $PATH, и как их воссоздать. Я, вероятно, добавлю поддержку для этого в будущем.

...