एक समाधान - एक ऐसा नहीं है जो उतना ही सुरुचिपूर्ण है जो * आरएस चर को बदलते हैं, लेकिन शायद बहुत स्पष्ट हैं:
PATH=`awk 'BEGIN {np="";split(ENVIRON["PATH"],p,":"); for(x=0;x<length(p);x++) { pe=p[x]; if(e[pe] != "") continue; e[pe] = pe; if(np != "") np=np ":"; np=np pe}} END { print np }' /dev/null`
पूरा कार्यक्रम BEGIN और END ब्लॉक में काम करता है । यह आपके PATH वैरिएबल को पर्यावरण से खींचकर, यूनिटों में विभाजित करता है। यह तब परिणामी सरणी p (जो क्रम में बनाई गई है split()
) से अधिक पुनरावृत्त करता है । सरणी ई एक साहचर्य सरणी है जिसका उपयोग यह निर्धारित करने के लिए किया जाता है कि हमने वर्तमान पथ तत्व (जैसे / usr / स्थानीय / बिन ) को देखा है या नहीं , और यदि नहीं, तो np को जोड़ा जाता है , तर्क के साथ बृहदान्त्र को जोड़ने के लिए। एनपी अगर वहाँ पहले से ही में पाठ है एनपी । अंत ब्लॉक बस echos एनपी । इसे आगे जोड़कर सरल बनाया जा सकता है-F:
ध्वज, तीसरे तर्क को समाप्त करना split()
(जैसा कि यह FS को चूकता है ), और हमें बदलते np = np ":"
हुए np = np FS
, हमें दे रहा है:
awk -F: 'BEGIN {np="";split(ENVIRON["PATH"],p); for(x=0;x<length(p);x++) { pe=p[x]; if(e[pe] != "") continue; e[pe] = pe; if(np != "") np=np FS; np=np pe}} END { print np }' /dev/null
वास्तव में, मेरा मानना था कि for(element in array)
आदेश को संरक्षित करेगा, लेकिन ऐसा नहीं है, इसलिए मेरा मूल समाधान काम नहीं करता है, क्योंकि लोग अचानक परेशान हो जाएंगे अगर किसी ने अचानक उनके आदेश को तोड़ दिया $PATH
:
awk 'BEGIN {np="";split(ENVIRON["PATH"],p,":"); for(x in p) { pe=p[x]; if(e[pe] != "") continue; e[pe] = pe; if(np != "") np=np ":"; np=np pe}} END { print np }' /dev/null