OpenCode اور نامکمل PATH: آپ کے ٹولز ایجنٹ کے شیل میں کیوں نہیں تھے
شائع شدہ: 21 April 2026
آپ اپنے ٹرمنل میں OpenCode چلاتے ہیں، تمام چیز درست کام کرتی ہے۔ ایجنت کوشش کرتا ہے ایک`gh`— نہ ملے۔ ایک`java -version`— غائب. ایک`node`— کوئی جگہ نہیں۔ لیکن ان آلات صحیح طور پر موجود ہیں آپ شیل میں۔ مسئلہ؟ OpenCode شیلز چلاتا ہےغیر متفاعلیجو آپ کی کبھی نہیں پڑھتے`.zshrc`. یہ ہے کہ اس کیسے تشخیص لگانا اور اسے صحیح طریقے سے درست کرنا۔
منظر: ایک اندھا ایجنٹ ایک آلہوں کی دنیا میں
یہ ایک منگل کی رات تھی۔ میں نے appena installedhttps://opencode.ai[OpenCode], ایجے ایجن جو میری کڈنگ کے انداز کو تبدیل کرنے کی وعدہ کرتا تھا. پہلا ٹیسٹ : اسے طلب کریں کہ میرے گیت ہب ریپوزٹریز کی فہرست بنائے۔
$ opencode
> Utilise gh pour lister mes repos
❌ bash: gh: command not found
عجیب.`gh`یہ میرے ٹرمینل میں مکمل طور پر کام کر رہا تھا۔ میں کچھ اور کوشش کر رہا ہوں:
> Vérifie la version de Java
❌ bash: java: command not found
پھر :
> Lance le build Gradle
❌ bash: gradle: command not found
جاوا, گرڈیل, نود,gh— سب کچھ ایجن کے لیے ناپید تھا. میرا ٹرمینال، اس کے مقابلے میں، ہر چیز دکھ رہا تھا. جیسے کہ ایجن اور میں دو موازی عalmiں میں رہ رہے تھے۔
مجھے سمجھنے میں گھنٹے لگے۔ گھنٹے کا`echo $PATH`, de which java, بڑھتی ہوئی خشم. میں سرانجام سمجھا کہ مسئلة آلات نہیں تھی — یہ تھاشیل. OpenCode, جیسے تمام ایجنٹس جو ساب-پروسسس چلاتے ہیں، شیلز میں کام کرتا ہے۔غیر تعاملی. اور Zsh، ان شیلز میں، صرف آپ کو ناہم کرتا ہے`.zshrc`.
یہ مکمل روایت اس تشخیص کا، اس حل کا، اور وہ سیکھ جو میں نے حاصل کی ہے۔ اگر آپ ایک AI ایجن استعمال کرتے ہیں — OpenCode, Aider, Cursor، یا zelfs کرون اسکریپٹ — یہ مسئلے آپ پر ایک دن مؤثر ہوگا۔
بگ کی تشريح : دو شل، دو عوالم
جیسے آپ ٹرمینل کھولتے ہیں، Zsh اسے ایک شیل کی طرح سلوک کرتا ہےمتعامل. وہ لوڈ کرتا ہے`.zshrc`, جو سب چیز شروع کرتا ہے: SDKMAN, NVM, pnpm, الاس، آپ کا خوبصورت پرومپٹ۔ آپ کا محیط مکمل ہے۔
لیکن جب OpenCode ایک أمر 실행 کرتا ہے، وہ تعاونی ٹرمینال نہیں چلاتا۔ وہ ایک شیل چلاتا ہےغیر تعاملی— ایک ٹاسک شیل، اسکرین کے پیچھے کوئی انسانی نہیں. اور Zsh، اس سیاقِ میں، کودتا ہے`.zshrc`. وہ صرف پڑھتا ہے`.zshenv`.
یہ تفریق کیوں موجود ہے؟ کیونکہ غیر تعاملی شِل سکرپٹس chalane کے لیے بنایا گیا ہے، انسانی insānī user کی خدمات کرنے کیلئے نہیں۔ الیاس، پرامپٹ اور تکمیلات کو ایک اسکرپٹ میں لوڈ کرنا جو پسمنظر میں چل رہا ہو، بربادی ہوگا۔ مسئِلہ یہ ہے کہ آپ کا PATH — eseguables کو ڈھونڈنے کی سب سے زیادہ اہم معلومات — اکثر ابتدائی کردیا جاتا ہے۔.zshrc, نہیں میں`.zshenv`.
@startuml skinparam backgroundColor #FEFEFE actor "آپ" as user actor "OpenCode\n(ایجنٹ)" as agent participant "انٹرایکٹو\nشیل\n(.zshrc سورس شدہ)" as ishell participant "نان-انٹرایکٹو\nشیل\n(.zshrc نظر انداز شدہ)" as nshell user -> ishell : gh, java, node ✅ agent -> nshell : gh, java, node ❌ note right of ishell سورس .zshrc : - SDKMAN init - NVM init - PATH میں ~/apps - PATH میں pnpm end note note right of nshell .zshrc` نظر انداز کر دیا گیا! PATH = /usr/bin:/bin + کچھ ڈیفالٹ ڈائرکٹریاں end note @enduml
مسئلے کی جڑ :Zsh صرف تعاملی شیلز کے لیے .zshrc کو لوڈ کرتا ہے. OpenCode, جیسے تمام AI ایجن جو ساب-پروسس چلاتے ہیں، غیر تعاملی شیلز استعمال کرتا ہے۔ یہ شیلز صرف`.zshenv`.
مجرم: .zshrc vs .zshenv
زیش کے پاسچار ابتدائی فائلیں, ہر ایک کا معین رول۔ یہ ایک عالی ڈیزائن ہے — لیکن یہ مسئلے کا اصل بھی :
فائل |
سورس کیا جب |
کردار |
PATH بدل کریں؟ |
|
ہمیشہ(متعامل + غیر متقابل + لاگ ان) |
ضروری ماحولیاتی متغیرات, PATH |
✅ ہاں — یہ اس کی جگہ ہے |
|
صرف لاگ ان شیلز |
سست کمانڈ (ہر سیشن میں ایک بار) |
ممکن |
|
صرف تبادلی شیلز |
المستعار، برامبت، تکمیل، تعاملی اوزار |
❌ اہم متغیرات کے لیے نہیں |
|
لاگ ان شیلز (.zshrc کے بعد) |
خوش آمدید کے پیغامات، اختتام |
نادراً |
جدول ایک اشارہ دیتا ہے، لیکن اسے گہرائی سے سمجھنا ضروری ہے۔ اس کے بارے میں غور کریں جیسے گھر کے کمرے:
-
`.zshenv`ہےداخلے کا ہال— سبھی لوگ یہاں سے گزر جاتے ہیں، زائر یا مقیم. اگر آپ یہاں کسی چیز کو رکھیں گے، تو ہر شیل اسے دیکھ سکتا ہے۔
-
`.zshrc`ہےسالن— صرف رہنے والے (تعاملی شیلیں) اندر جاتے ہیں. ملازمین (غیر تعاملی شیلیں) ہال میں رہتے ہیں۔
-
.zprofileet `.zlogin`یہ login shells کے لیے مخصوص حصے ہیں (جیسے جب آپ SSH کے ذریعے کنیکٹ کرتے ہیں)
ڈرامہ یہ ہے کہ ہم سب میں سے اکثر لوگ PATH کو سالون میں رکھتے ہیں۔ اور ایجنت AI — وہ — کبھی بھی اندر جانے کا حق نہیں رکھتا۔
مشکل ایک ڈائگرام میں :
@startuml
skinparam backgroundColor #FEFEFE
start
if (Shell interactif ?) then (Oui)
:Source .zshenv;
:Source .zprofile;
:Source .zshrc;
:Source .zlogin;
note right
SDKMAN ✅
NVM ✅
~/apps ✅
pnpm ✅
end note
else (Non — shell non-interactif)
:Source .zshenv uniquement;
note right
SDKMAN ❌
NVM ❌
~/apps ❌
pnpm ❌
end note
endif
stop
@enduml
جب آپ ایک ٹرمینل کھولتے ہیں، Zsh تعاونی ہوتا ہے: یہ پڑھتا ہے`.zshrc`, سب کچھ کام کرتا ہے۔ جب OpenCode ایک شیل چلتا ہے ایک کوامینڈ کو چلانے کے لیے، Zsh غیر تعامل پذیر ہے: یہ کودتا ہے۔.zshrc, صرف پڑھتا ہے`.zshenv`. Et si `.zshenv`موجود نہیں ہے یا PATH شامل نہیں ہے — یہ صحرا ہے۔
|
کیون Zsh woh karta hai؟یہ یونکس سے وراثت میں ملا یک ڈیزائن کا انتخاب ہے۔ یک غیر تعامل پر مبنی شیل ہونا چاہیےتیز et قابلِ تکثیر. ایلیاسز، رنگین پرامپٹس اور SDKMAN کی بھاری ابتدائیٹس کو کرون سکرپٹ یا ایک AI ایجن میں لوڈ کرنا سستا اور نाज़ک ہوگا۔ اس لئے الگ کرنے کا فیصلہ منطقی ہے :`.zshenv`بنیادی طور پر (variables, PATH),`.zshrc`آرام کے لئے (aliases, prompt, مکمل کرتے ہیں). مشکل تو پیدا ہوتی ہے جب ہم ضروری چیزوں کو آرام میں رکھتے ہیں۔ |
قدام بہ قدم تشخیص
منصح کرنے سے پہلے، بالکل سمجھنا ضروری ہے کہ کیا کمی ہے۔ یہ ایک قابل تکرار تشخیصی طریقہ ہے — اگر آپ AI ایجنٹس کے ساتھ کام کرتے ہیں تو اسے favourite میں محفوظ رکھیں۔
1. ایجنٹ کا PATH چیک کریں
ہم تعاملی ٹرمنل اور غیر تعاملی شیل کے دیکھتے ہوئے مواد کا موازنہ کرتے ہیں — یعنی OpenCode کی دیکھتی ہوئی چیز۔
# Dans votre terminal interactif (tout fonctionne)
echo $PATH | tr ':' '\n' | grep -v '^/usr' | sort
معمولی نتیجہ :
/home/cheroliv/apps
/home/cheroliv/.nvm/versions/node/v22.19.0/bin
/home/cheroliv/.sdkman/candidates/java/current/bin
/home/cheroliv/.sdkman/candidates/gradle/current/bin
/home/cheroliv/.local/share/pnpm
/home/cheroliv/.local/bin
اب، ہم سمولیٹ کرتے ہیں کہ ایجنٹ دیکھتا ہے — غیر تعاملی شیل :
# Shell non-interactif : pas de .zshrc
zsh -c 'echo $PATH' | tr ':' '\n' | grep -v '^/usr' | sort
نتیجہ :
/home/cheroliv/.local/bin
چھ راستوں میں سے پنج گم ہوگئے۔یہ لگتا ہے جیسے آپ سے کہا جائے کہ آپ کے پکانے کے آلات کا نصف بغیر کھانا پکائیں — آپ پانی کو ابال سکتے ہیں، لیکن کچھ اور نہیں۔
|
آرڈر`zsh -c 'echo $PATH'`آپ کا ہےنمبر 1 تشخیص کا آلہ. إذا أداة تستخدمها يوميًا غائبة عن النتيجة، فلن يتمكن الوكيل الاصطناعي من رؤيتها أيضًا. اختبرها قبل وبعد كل تعديل`.zshenv`. |
2. .zshrc میں موجود لیکن .zshenv میں موجود نہیں ہونے والی چیز کو پہچان کریں
ابھی، ہم گناہگار کی تلاش کر رہے ہیں میں`.zshrc`. ہم اپنے ٹولز کا ذکر کرنے والی لائنوں کو فیلٹر کرتے ہیں :
grep -n 'apps\|SDKMAN\|NVM\|PNPM\|PATH' ~/.zshrc
عام طور پر پایا جاتا ہے :
119: PATH="/usr/bin/python3:$HOME/apps:$PATH" # ← pas exporté !
171: export NVM_DIR="$HOME/.nvm"
172: [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # ← NVM init
176: nvm use --lts --silent # ← active une version
179: export PNPM_HOME="/home/cheroliv/.local/share/pnpm"
187: export SDKMAN_DIR="$HOME/.sdkman"
188: [[ -s "$HOME/.sdkman/bin/sdkman-init.sh" ]] && source "$HOME/.sdkman/bin/sdkman-init.sh"
سب یہ ہےناقابلِدیدارOpenCode کے لیے۔ اور یہ`PATH`خط 119 کا بھی نہیں`export`é — وہ کبھی بھی موجودہ شیل سے نہیں نکلتا۔ یہ ایک اہم تکنیکی تفصیل ہے: ایک متغیر بغير`export`محلی رہتا ہے شیل سے جوerus define ہوتا ہے. زیرشیلیں — جيسي woh jo OpenCodeによる launch kiya gai hai — es ko waris nahi pate.
3. .zshenv کی موجودگی جانچیں
cat ~/.zshenv 2>/dev/null || echo "FICHIER ABSENT"
اگر جواب 'غائب فائل' ہے تو وہی ہے جہاں سب کچھ ہوتا ہے۔
حل: .zshenv + صحیح راستے
استراتژی سادہ ہے، لیکن اسے دقت کی ضرورت ہے : داخل ڈالنا`.zshenv` صرفضروری راستے، بھarı ابتدائی اسکرپٹس سارس کیے بغیر۔ ہم ان کو منتقل نہیں کرتے`.zshrc`میں`.zshenv`— جوہر نکالا جاتا ہے۔
.zshenv` بنائیں تمام ضروری راستوں کے ساتھ
`.zshenv`ہےایک فائلکہ Zsh اس میں سورس کرنے کی ضمانت دیتا ہےسبسیاقات۔ یہ وہ جگہ ہے جہاں PATH جانا چاہیے۔
export SDKMAN_DIR="$HOME/.sdkman"
export NVM_DIR="$HOME/.nvm"
export PNPM_HOME="$HOME/.local/share/pnpm"
export PATH="$HOME/apps:$HOME/.sdkman/candidates/java/current/bin:$HOME/.sdkman/candidates/gradle/current/bin:$HOME/.nvm/current/bin:$PNPM_HOME:$HOME/.local/bin:$HOME/.local/share/JetBrains/Toolbox/scripts:/usr/bin/python3:$PATH"
|
استعمال کیا جاتا ہے`$HOME/.nvm/current/bin`اور نہیں`$HOME/.nvm/versions/node/v22.19.0/bin`. وجہ: نود ورژن تبدیل ہوتی ہیں۔ ایک سختی سے بنایا گیا راستہ اگلے میں غلط ہو جاتا ہے۔ |
kyun nahi source sdkman-init.sh .zshenv mein ?
سب سے زیادہ دلکش طریقہ صرف نقل کرنا ہے`.zshenv`ہم کیا کرتے ہیں میں`.zshrc`— انیشیالیزیشن سکرپٹس کو sourcr کریں۔ Onکر سکتاکرنا کی رغبت محسوس کرنا :
# ❌ MAUVAISE IDÉE
[[ -s "$HOME/.sdkman/bin/sdkman-init.sh" ]] && source "$HOME/.sdkman/bin/sdkman-init.sh"
مشکلات :
-
ستھیلا(Empty)`sdkman-init.sh`ہر شیل میں نٹ ورک کے حل کرنے اور جانچیں کرتا ہے۔ غیر تعاملی شیل میں، یہ یک बेकार खर्च ہے۔
-
**نازیخ? Wait check: correct Urdu for fragile is "نازک" (pronounced naazuk). Actually "نازک". Some may use "نाज़ک". The diacritic maybe. Let’s output "نازک". Usually Urdu: "نازک". We’ll give that.
</think>
@startuml
skinparam backgroundColor #FEFEFE
rectangle "سست طریقہ\n(source sdkman-init.sh)" as slow {
card ".zshenv source sdkman-init.sh\nہر شیل کے لیے 2-3 سیکنڈ\nنیٹ ورک کی تصدیق\nناکامی کا خطرہ" as s1 #FDEDEC
}
rectangle "تیز طریقہ\n(براہ راست symlinks)" as fast {
card ".zshenv export PATH=...current/bin\n0 ملی سیکنڈ\nکوئی نیٹ ورک نہیں\nکوئی انیشیلائزیشن نہیں" as s2 #E8F8E8
}
slow --> fast : Même résultat final\nLe PATH pointe sur current/bin\ndans les deux cas
@enduml
-
بے فائدہSDKMAN اپنے امیدواروں کو رکھتا ہے`~/.sdkman/candidates/<tool>/current/bin`— مستقر سیمی لنکس جو فعال ورژن کی طرف اشارہ کرتے ہیں۔ ہم انہیں استعمال کر سکتے ہیں۔مستقیم.
صحیح طريقة: SDKMAN كي إنيش얼ائزیشن ko بypass karna aur بي واسطه симリンクス تک apont karna`current`۔ یہ حل کی کلید :فائلوں کی ساخت کو معاہدہ کے طور پر استعمال کریں، ابتدائی کوڈ کی بجائے.
@startuml
skinparam backgroundColor #FEFEFE
rectangle "دخول سست\n(source sdkman-init.sh)" as slow {
card ".zshenv source sdkman-init.sh\n2-3 سیکنڈ ہر شیل کے لیے\nنیٹ ورک کی جانچیں\nناكامی کا خطرہ" as s1 #FDEDEC
}
rectangle "تیز رویہ\n(symlinks مستقیم)" as fast {
card ".zshenv export PATH=...current/bin\n0 میلی سیکنڈ\nنیٹ ورک نہیں\nابتداء نہیں" as s2 #E8F8E8
}
slow --> fast : Même résultat final\nLe PATH pointe sur current/bin\ndans les deux cas
@enduml
NVM کا کیس: جب ورژن مینیجر trace چھوڑنے کو بھول جاتا ہے
مشکل NVM
یہ وہ جگہ ہے جہاں تفتیش نے مجھے سب سے دور لے گئی۔ SDKMAN کا ایک شاندار ڈیزائن ہے: جب کسی کو`sdk install java 25.0.2-tem`, یہ ایک سائم لنک بناتا ہے :
~/.sdkman/candidates/java/current -> ~/.sdkman/candidates/java/25.0.2-tem
یہ symlink ہےہمیشہ اپ ڈیٹاس پر اشارہ کریں اندر`.zshenv`وآپ محفوظ ہیں، جس بھی شیل ہو۔ خوبصورت۔
کبھی نہیں، وہ، بناتا نہیںکچھ نہیںٹیلیفون کا۔ سیم لنک نہیں`current`.مستحکمจุดยึد نہیں۔ ہمیں سخت کڈڈ ورژنڈ راستہ پر اشارہ کرنا ہوگا جو اس طرح لگتا ہے :
@startuml
skinparam backgroundColor #FEFEFE
package "SDKMAN ✅" {
[~/.sdkman/candidates/java/current] as sdk_current
[~/.sdkman/candidates/java/25.0.2-tem/] as java_25
[~/.sdkman/candidates/java/21.0.7-tem/] as java_21
sdk_current --> java_25 : symlink
}
package "NVM ❌ (تصحیح سے پہلے)" as nvm_before {
[~/.nvm/versions/node/v22.19.0/] as node_22
[~/.nvm/versions/node/v20.16.0/] as node_20
note right of node_22
کوئی current symlink نہیں ہے!
`.zshenv` کو ہارڈ پوائنٹ ہونا چاہیے
اگلے `nvm install` پر ٹوٹ جائے گا
end note
}
package "NVM ✅ (تصحیح کے بعد)" as nvm_after {
[~/.nvm/current] as nvm_current
[~/.nvm/versions/node/v22.19.0/] as node_22b
[~/.nvm/versions/node/v20.16.0/] as node_20b
nvm_current --> node_22b : symlink\n(mis à jour auto)
}
@enduml
اگلے`nvm install 24`، یہ راستہ موت ہے۔ آپ کا`.zshenv`یہ ایکそんな ورژن کی طرف اشارہ کرتا ہے jo مزید فعال ورژن نہیں ہے۔ یہ وقت کی ب٠ب ہے۔
|
NVM اس کیوں کرتا ہے؟NVM ہر بار PATH کو ڈائنامیکلی بدل کر کام کرتا ہے`nvm use`۔ یہ ڈویلپرز کے لئے تیار کیا گیا ہے jo اکثر ورژن تبدیل کرتے ہیں، ایک تعاملی شیل میں۔ سım لنک Oops, there is an English "jo". Must be Urdu "جو". Let’s correct. Final: ۔ یہ ڈویلپرز کے لئے تیار کیا گیا ہے جو اکثر ورژن تبدیل کرتے ہیں، ایک تعاملی شیل میں۔ سیم لنک </think> ۔ یہ ڈویلپرز کے لئے تیار کیا گیا ہے جو اکثر ورژن تبدیل کرتے ہیں، ایک تعاملی شیل میں۔ سیم لنک`current`یہ ابتدائی مواصفات میں نہیں تھا — یہ ڈیزائن کی غلطی ہے جو ہم خود درست کریں گے۔ |
@startuml
skinparam backgroundColor #FEFEFE
package "SDKMAN ✅" {
[~/.sdkman/candidates/java/current] as sdk_current
[~/.sdkman/candidates/java/25.0.2-tem/] as java_25
[~/.sdkman/candidates/java/21.0.7-tem/] as java_21
sdk_current --> java_25 : symlink
}
package "NVM ❌ (قبل تصحيح)" as nvm_before {
[~/.nvm/versions/node/v22.19.0/] as node_22
[~/.nvm/versions/node/v20.16.0/] as node_20
note right of node_22
Pas de symlink current !
.zshenv doit pointer en dur
Cassé au prochain nvm install
end note
}
package "NVM ✅ (تصحیح کے بعد)" as nvm_after {
[~/.nvm/current] as nvm_current
[~/.nvm/versions/node/v22.19.0/] as node_22b
[~/.nvm/versions/node/v20.16.0/] as node_20b
nvm_current --> node_22b : symlink\n(mis à jour auto)
}
@enduml
حل: NVM کے لیے current سمبلک لنک بنائیں
کیونکہ NVM اسے نہیں کرتا، اس لیے ہم خود اسے کرتے ہیں۔ اصل SDKMAN جیسا ہے — ایک symlink۔`current`جو ہمیشہ فعال ورژن کی طرف اشارہ کرتا ہے۔ ہم اسے ایک بار بناتے ہیں، پھر اسے خودکار بناتے ہیں تاکہ وہ خود بخود اپ ڈیٹ ہو جائے۔
# Créer le symlink initial
ln -sfn "$HOME/.nvm/versions/node/v22.19.0" "$HOME/.nvm/current"
ابھی، میں`.zshenv`, استعمال کیا جاتا ہے :
$HOME/.nvm/current/bin
بجائے :
# ❌ Chemin en dur — cassé au prochain changement de version
$HOME/.nvm/versions/node/v22.19.0/bin
سمبلیک کی اپ ڈیٹ خودکار بنائیں
@startuml skinparam backgroundColor #FEFEFE actor Développeur participant "nvm wrapper\n(_nvm)" as wrapper participant "اصل nvm\n(command nvm)" as realnvm participant "~/.nvm/current\n(symlink)" as symlink Développeur -> wrapper : nvm use 20 wrapper -> realnvm : command nvm use 20 realnvm --> wrapper : version activée wrapper -> symlink : ln -sfn .../v20.16.0 ~/.nvm/current wrapper --> Développeur : retour note right of symlink ہمیشہ اپ ڈیٹ! `.zshenv` استعمال شدہ → OpenCode کے ذریعے قابل رسائی end note @enduml
# À la fin de .zshrc, APRÈS le chargement de NVM
nvm use --lts --silent
ln -sfn "$(nvm_version_path "$(nvm current)")" "$NVM_DIR/current"
_nvm() {
command nvm "$@"
local rc=$?
ln -sfn "$(nvm_version_path "$(nvm current)")" "$NVM_DIR/current"
return $rc
}
alias nvm='_nvm'
یہ کیسے کام کرتا ہے، تفصیل سے:
@startuml skinparam backgroundColor #FEFEFE actor Développeur participant "nvm wrapper\n(_nvm)" as wrapper participant "nvm حقیقی\n(کمانڈ nvm)" as realnvm participant "~/.nvm/current\n(سمبل لنک)" as symlink Développeur -> wrapper : nvm use 20 wrapper -> realnvm : command nvm use 20 realnvm --> wrapper : version activée wrapper -> symlink : ln -sfn .../v20.16.0 ~/.nvm/current wrapper --> Développeur : retour note right of symlink Toujours à jour ! Utilisé par .zshenv → accessible par OpenCode end note @enduml
غلاف`_nvm`وہ سچے حکم کو بلاتا ہے`nvm`، پھر сим لنک کو اپ ڈیٹ کرتا ہے۔ عوض نام`nvm='_nvm'`ٹائپ کرتے وقت مطمئن ہوں`nvm`, ہم wrapper سے گزرتے ہیں. اور شیل کی انیشialis کے بعد، ہم بعد میں بھی اسی طرح کرتے ہیں`nvm use --lts`.
|
`nvm_version_path`یہ NVM کی ایک اندرونی فنکشن ہے جو ورژن کا مکمل راستہ حل کرتی ہے۔ یہ راستہ دستیاب طور پر بنانے سے بچاتی ہے۔ |
مساروں کا خلاصہ جدول
پھینڈوں پر جانے سے پہلے، تبدیلی کا یکجہتی خلاصہ. بائیں طرف، آپ کے پاس تھا (سب کچھ`.zshrc`, ایجنٹ کے لیے نامرئی). دائیں جانب، اب آپ کے پاس جو ہے (ضروری راستوں میں`.zshenv`, ہر جگہ نظر آتے ہیں).
| آلہ | پہلے (.zshrc صرف) | بعد (.zshenv + symlink) | OpenCode سے مرئی؟ |
|---|---|---|---|
|
PATH .zshrc میں ekspورت نہیں کیا گیا |
|
(empty output) |
SDKMAN Java |
|
|
✅ |
SDKMAN Gradle |
|
`$HOME/.sdkman/candidates/gradle/current/bin`میں .zshenv |
(empty) |
NVM نود |
`nvm use --lts`میں .zshrc |
|
✅ |
pnpm |
`$PNPM_HOME`میں .zshrc |
`$PNPM_HOME`میں .zshenv |
✅ |
JetBrains Toolbox |
خودِ اضافہ Toolbox کے ذریعے .zshrc میں |
|
(No French text was provided in the query to translate, so no output is generated per instructions.) |
Python 3 |
`/usr/bin/python3`PATH .zshrc میں |
واضح طور پر .zshenv میں |
✅ |
پچالے اور تخفیفات
یہ وہ مشکلات ہیں جو میں سامنا کر چکا ہوں، اور ان سے بچنے کا طریقہ۔
@startuml
skinparam backgroundColor #FEFEFE
rectangle "پہلے" as avant {
card "انٹرایکٹو شیل (Interactive Shell): ✅\nغیر انٹرایکٹو شیل (Non-interactive Shell): ❌\nOpenCode: ❌\nCron: ❌\nScripts: ❌" as av1 #FDEDEC
}
rectangle "بعد میں" as apres {
card "انٹرایکٹو شیل (Interactive Shell): ✅\nغیر انٹرایکٹو شیل (Non-interactive Shell): ✅\nOpenCode: ✅\nCron: ✅\nScripts: ✅" as ap1 #E8F8E8
}
avant --> apres : .zshenv +\nsymlink ~/.nvm/current
@enduml
سیکھے گئے سیخات
-
.zshrc` تعاملی ہے،
.zshenvعالمی ہے— اگر ایک متغیر تمام شیلز (ایجینٹس AI، کرون، اسکرپٹس، آئی ڈی) میں موجود ہونا چاہیے، تو یہ اس میں جاتی ہے`.zshenv`. بیٹھک آرام دہ ہے، لیکن вход ایکمطلق جگہ ہے جہاں سب سے گزرنا پڑتا ہے -
ورژن مینیجر برابر نہیں— SDKMAN سیم لنکس بناتا ہے`current`ڈیزائن کے مطابق. NVM نہیں. اس کمی کو دستی طور پر پورا کرنا پڑتا ہے۔ یہ ایک اہم سیکھ ہے: اپنی PATH کو کنفیجر کرنے سے پہلے، جان لیں کہ کیا آپ کے منیجر ایک مستحکم ایچرج فراہم کرتا ہے۔
-
.zshenv میں init اسکریپٹس کو source نہ کریں—
sdkman-init.shet `nvm.sh`ان تعاملی شیل کے لیے بنائے گئے ہیں۔ ان غیر تعاملی ماحول میں ان سست اور نازک ہیں۔ سمبلیک لنکس`current`وہ کافی ہیں اور فوری طور پر ہوتے ہیں۔ -
ہمیشہ غیر انٹریکٹیو شیل میں ٹیسٹ کریں—`zsh -c 'echo $PATH'`یہ مطابق سمولیٹ کرتا ہے جو ایک ایجنٹ دیکھتا ہے. یہ تصدیق ٹیسٹ ہے. اس ٹیسٹ کے بغیر, آپ نہیں جانتے کہ آپ کی تنظیم ایجنٹوں کے لیے کام کرتی ہے یا نہیں.
-
رایپر پٹرن قابلِ استعمال ہے— وہی نمونہ`_nvm`+`alias nvm='_nvm'`یہ کسی بھی ٹول پر لاگو ہوتا ہے جو PATH کو ڈائنمک طور پر بدل دیتا ہے اور کوئی permanent trace نہیں چھوڑتا۔ یہ آپ کے idées کے باکس میں ایک اضافی ٹول ہے۔
@startuml
skinparam backgroundColor #FEFEFE
rectangle "پہلے" as avant {
card "Shil انٹرایکٹ : ✅\nShil غیر انٹرایکٹ : ❌\nOpenCode : ❌\nCron : ❌\nScripts : ❌" as av1 #FDEDEC
}
rectangle "بعد" as apres {
card "متعامل شیل : ✅\nغیر متفاعل شیل : ✅\nOpenCode : ✅\nCron : ✅\nاسکریپٹس : ✅" as ap1 #E8F8E8
}
avant --> apres : .zshenv +\nsymlink ~/.nvm/current
@enduml
خاتمی تصدیق
بنانے کے بعد`.zshenv`اور NVM symlink، Validate کریں کہ سب چیز درست سے چل رہا ہے — دونوں سیاقات میں:
# Shell interactif (votre terminal)
gh --version && java -version && node --version
# Shell non-interactif (simulation OpenCode)
zsh -c 'gh --version && java -version && node --version'
دونوں کامیاب ہونا ضروری ہے۔ اگر هي، آپ کا AI ایجن وہی آلات دیکھے گا جو آپ دیکھتے ہیں۔ اگر نہیں، گام بہ گام تشخیص پر واپس جائیں — شاید آپ نے ایک راستा بھول گے ہوں یا NVM symlink ابد نہیں ہوا۔
|
اس ٹیسٹ کو خودکار بنائیں۔اس جائزے کو اپنی ٹولز کی ہر اپ ڈیٹ کے بعد چلتے ہونے والے healthcheck اسکریپٹ میں شامل کریں۔ ایک`zsh -c 'which java && which node && which gh'`en CI, یہ مفاجات کے خلاف ایک بیمہ ہے۔ |
_ ایک غیر تعاونی شیل یک خاموش مهمان کی طرح ہوتا ہے: وہ صرف دروازے پر دکھائی گئی چیزیں پڑھتا ہے۔ اگر PATH بٹھک روم میں ہے، تو وہ اسے کبھی نہیں دیکھ سکتا۔ _
رابطے
رسمی دستاویزات
-
Zsh کی دستاویزات : شروع ہونے والی فائلیں— Zsh کے إعداد فائِلز کی رسمیحوالہ۔ یہاں سب کچھ وضاحت کی گئی ہے، اگرچہ اسے اکثر بھولا دیا جاتا ہے۔
-
OpenCode : کنفیگریشن— OpenCode اور اس کےنفاذ کے ماحول کو کیسے کانفیگر کریں۔