PATH

, by  Valentin Murariu

V-aţi lovit vreodata de vreo maşină *NIX, sau chiar Windows, care are o variabila de mediu PATH oribil de lungă şi în care aceeaşi cale apare de 3 ori în locuri diferite ? Eu mă lovesc destul de des de asta.

Cum rezolvam simplificarea variabilei PATH ? De obicei copiam in clipboard si făceam paste într-un editor de text oarecare. După aceea mă apucam să tai în bucăţi, în Windows după ; iar in *NIX dupa : - după aceea ordonam şi eliminam liniile duble; din nou lipeam împreună liniile utilizând ; sau : după caz.

Ieri am avut de-a face cu un PATH care era mai lung decât mă ţine pe mine răbdarea să procesez ’la mână’ - conform procedurii de mai sus.

Aşa că am trecut la etapa următoare:

Sub *NIX

- Am deschis un shell BASH (sau KSH) unde am lansat chestia asta [1]:


- Iniţializaţi variabila PATH cu noua valoare în fişierul .profile sau bash_profile sau mai ştiu eu ce fişier foloseşte shell-ul dumneavoastră.

Sub Windows

- Am instalat GNU utilities for Win32.
- Am deschis un prompt DOS şi am scris aşa:


- Mai departe nu ştiu să automatizez din lipsa de cunoştinţe despre posibilităţile prompt-ului DOS de a: bucla, citi linii din pipe-uri sau stdin, scris formatat [2] pe stdout - dacă aceste funcţionalităţi chiar or fi existând :-). De aici mai departe, am luat lista obţinută şi am transformat-o manual într-o singură linie pe care am re-inserat-o în PATH.

[1care se traduce în felul acesta:
- scrie pe stdout variabila PATH
- pune conţinutul stdout într-un pipe citit de (g)awk
- (g)awk face următoarele: sparge ce a citit din pipe într-un tablou de variabile (spargerea se face folosind separatorul ":"); pentru fiecare element al tabloului scrie câte o line pe stdout.
- liniile generate de (g)awk sunt puse într-un pipe citit de sort
- liniile sortate de sort sunt puse într-un pipe citit de uniq, care elimină liniile duble
- liniile unice generate de uniq sunt puse într-un pipe citite de un subshell care buclează până când citeşte toate liniile din pipe. La fiecare iteraţie, imprimă pe stdout conţînutul liniei sufixat cu ":"

[2vezi printf din BASH