Created
July 24, 2026 16:05
-
-
Save Hammer2900/6fbc8f29332e394c30e5bf4fe2c359a6 to your computer and use it in GitHub Desktop.
pathchk — посмотреть диагностику текущего $PATH
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| chkpath() { | |
| local do_fix=0 | |
| local query="" | |
| # Разбор аргументов | |
| while [ "$#" -gt 0 ]; do | |
| case "$1" in | |
| -f|--fix) | |
| do_fix=1 | |
| shift | |
| ;; | |
| -h|--help) | |
| echo "Использование: chkpath [-f|--fix] [поисковый_запрос]" >&2 | |
| return 0 | |
| ;; | |
| *) | |
| query="$1" | |
| shift | |
| ;; | |
| esac | |
| done | |
| # Предупреждение о поиске в режиме фикса (п. 4) | |
| if [ "$do_fix" -eq 1 ] && [ -n "$query" ]; then | |
| echo "Предупреждение: поисковый запрос '$query' игнорируется в режиме --fix" >&2 | |
| fi | |
| # 1. РЕЖИМ АВТО-ФИКСА (-f / --fix) | |
| if [ "$do_fix" -eq 1 ]; then | |
| local entry | |
| local new_path_array=() | |
| local -A seen_map=() # Ассоциативный массив для exact matching O(1) (п. 1) | |
| local removed_nonexistent=0 | |
| local removed_duplicates=0 | |
| local removed_empty=0 | |
| while IFS= read -r entry; do | |
| # Пустая запись в $PATH означала текущую директорию (п. 3) | |
| if [ -z "$entry" ]; then | |
| ((removed_empty+=1)) | |
| continue | |
| fi | |
| # Удаляем несуществующие папки (безопасный инкремент п. 2) | |
| if [ ! -d "$entry" ]; then | |
| ((removed_nonexistent+=1)) | |
| continue | |
| fi | |
| # Удаляем дубликаты | |
| if [[ -n "${seen_map[$entry]}" ]]; then | |
| ((removed_duplicates+=1)) | |
| continue | |
| fi | |
| seen_map["$entry"]=1 | |
| new_path_array+=("$entry") | |
| done <<< "${PATH//:/$'\n'}" | |
| # Собираем чистый $PATH через двоеточие | |
| local cleaned_path | |
| cleaned_path="$(IFS=:; echo "${new_path_array[*]}")" | |
| # Применяем в текущей сессии! | |
| export PATH="$cleaned_path" | |
| echo -e "\033[1;32m=== \$PATH успешно очищен! ===\033[0m" | |
| echo " • Удалено несуществующих папок: $removed_nonexistent" | |
| echo " • Удалено дубликатов: $removed_duplicates" | |
| [ "$removed_empty" -gt 0 ] && echo " • Удалено пустых записей (.): $removed_empty" | |
| echo -e "\nНовый список \$PATH:" | |
| chkpath | |
| return 0 | |
| fi | |
| # 2. РЕЖИМ ОБОЗРЕВАТЕЛЯ / ПОИСКА | |
| local path_entry | |
| local -A seen_map=() # Ассоциативный массив для обозревателя (п. 1) | |
| echo "=== Диагностика переменной \$PATH ===" | |
| while IFS= read -r path_entry; do | |
| # Подсветка пустой записи | |
| if [ -z "$path_entry" ]; then | |
| if [ -z "$query" ] || echo "." | grep -qi -e "$query"; then | |
| echo -e "\033[1;31m[НЕБЕЗОПАСНО] . (Пустая запись / текущая папка)\033[0m" | |
| fi | |
| continue | |
| fi | |
| if [ -n "$query" ]; then | |
| if ! echo "$path_entry" | grep -qi -e "$query"; then | |
| continue | |
| fi | |
| fi | |
| local status="" | |
| if [ ! -d "$path_entry" ]; then | |
| status="\033[1;31m[НЕ СУЩЕСТВУЕТ]\033[0m" | |
| elif [[ -n "${seen_map[$path_entry]}" ]]; then | |
| status="\033[1;33m[ДУБЛИКАТ] \033[0m" | |
| else | |
| status="\033[1;32m[OK] \033[0m" | |
| seen_map["$path_entry"]=1 | |
| fi | |
| if [ -n "$query" ]; then | |
| local highlighted | |
| highlighted=$(echo "$path_entry" | grep -i --color=always -e "$query") | |
| echo -e "$status $highlighted" | |
| else | |
| echo -e "$status $path_entry" | |
| fi | |
| done <<< "${PATH//:/$'\n'}" | |
| # Понятный цвет циан вместо темного серого (п. 5) | |
| echo -e "\n\033[0;36m(Подсказка: запустите 'pathfix' или 'chkpath -f' для авто-очистки \$PATH)\033[0m" | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment