Skip to content

Instantly share code, notes, and snippets.

@Hammer2900
Created July 24, 2026 16:05
Show Gist options
  • Select an option

  • Save Hammer2900/6fbc8f29332e394c30e5bf4fe2c359a6 to your computer and use it in GitHub Desktop.

Select an option

Save Hammer2900/6fbc8f29332e394c30e5bf4fe2c359a6 to your computer and use it in GitHub Desktop.
pathchk — посмотреть диагностику текущего $PATH
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