विंडोज पर Ubuntu (विंडोज के लिए AKA Linux सबसिस्टम) पर BASH - मैं अपना पैट कैसे सेट करूं?


8

वर्षगांठ अद्यतन के लिए धन्यवाद, मेरे पास अब उबंटू ऑन विंडोज 10 है। पहले, मैंने सिग्विन का इस्तेमाल किया था, और साइगविन में मावेन की स्थापना की थी, (और यह पूरी तरह से काम कर रहा था), जिसमें मावेन को स्थापित करने में मुख्य रूप से शामिल था, और फिर अपने PATHवातावरण को संशोधित करना। चर (में ~/.bashrc)

ठीक है, मैं BUW का उपयोग करके एक ही काम करने की कोशिश कर रहा हूं, लेकिन जहां तक ​​मैं बता सकता हूं, PATHचर को नजरअंदाज किया जाता है (मावेन बिन निर्देशिका को जोड़कर PATH, और फिर which mvnरिटर्न को खाली करते हुए)। क्या कोई ट्रिक है जो मुझे याद आ रही है, या क्या मुझे PATHBUW में अपना अलग सेट अप करना है ?

संपादित करें:

मुझे विशिष्ट होने दो। मुझे "???" में क्या करने की आवश्यकता है pathTestScript.sh को पथ पर लाने के लिए कदम?

mkdir -p ~/pathTest
touch ~/pathTest/pathTestScript.sh
echo '#!/bin/sh' >> ~/pathTest/pathTestScript.sh
echo 'echo "it works!"' >> ~/pathTest/pathTestScript.sh
bash ~/pathTest/pathTestScript.sh
    # Should output 'it works!'
# ?????????
pathTestScript.sh
    # Should output it works!'

संपादित करें 2:

मैं अपने वास्तविक, अंतिम लक्ष्य के साथ बहुत स्पष्ट होना चाहता हूं। मैं एक JDK और Apache Maven को सामान्य स्थानों पर अपने सिस्टम पर स्थापित कर चुका हूँ। मैं साइगविन में इन दोनों को पूरी तरह से ठीक काम कर रहा था। अब जब बुआ बाहर हो गई हैं, तो मैं उन्हें इसके बजाय वहां इस्तेमाल करना चाहता हूं, लेकिन मैं यह पता नहीं लगा सकता कि मैं उनके लिए अपना वातावरण कैसे सेट करूं, क्योंकि मेरे पाथ में जो भी बदलाव होते हैं, उनका कोई असर नहीं होता है।

संपादित करें 3:

ठीक है, अब मैं चिंतित हूं कि मैं एक जंगली हंस पीछा कर रहा हूं। अगर मैं करता हूं echo $PATH, तो मुझे मिलता है/mnt/c/Program\ Files/apache-maven-3.3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

यही मैं उम्मीद करता हूं। यही मैंने अपनी ~/.bashrcफ़ाइल में डाला है ... फिर मैं करता हूँ ls /mnt/c/Program\ Files/apache-maven-3.3.9/binऔर मुझे मिलता है

m2.conf  mvn  mvn.cmd  mvnDebug  mvnDebug.cmd  mvnyjp

लेकिन जब मैं करता हूं which mvn, मैं खाली हो जाता हूं, और अगर मैं आह्वान करता mvnहूं, तो मुझे apt-getइसे स्थापित करने के लिए उपयोग करने के लिए पुनर्निर्देशित किया जाता है।

इसलिए मुद्दा यह नहीं है कि पाथ को अपडेट नहीं किया जा रहा है ... इसे सिर्फ नजरअंदाज किया जा रहा है। क्या पेटीएम पर ध्यान देने के लिए इसे प्राप्त करने का कोई तरीका है? यदि नहीं, तो यह लिनक्स (IMO) का एक बहुत कमजोर संस्करण है

संपादित करें 4:

यह एक दो बार लाया गया है, और हाँ, मेरे थप्पड़ एक साथ उदाहरण के रूप में फ़ाइल निष्पादन योग्य के रूप में चिह्नित करने के लिए भूल गया। मेरे वास्तविक दुनिया के परिदृश्य में (मावेन के साथ), फाइलें सभी निष्पादन योग्य हैं:

cd /mnt/c/Program\ Files/apache-maven-3.3.9/bin && ls -alt
total 36
dr-xr-xr-x 2 root root    0 Apr 19 11:56 ..
-r-xr-xr-x 1 root root 1843 Apr 19 11:56 mvnyjp
dr-xr-xr-x 2 root root    0 Apr 19 11:56 .
-r-xr-xr-x 1 root root 1815 Apr 19 11:56 mvnDebug
-r-xr-xr-x 1 root root 7383 Apr 19 11:56 mvn
-r-xr-xr-x 1 root root 1513 Apr 19 11:56 mvnDebug.cmd
-r-xr-xr-x 1 root root 6067 Apr 19 11:56 mvn.cmd
-r-xr-xr-x 1 root root  230 Apr 19 11:56 m2.conf

1
शायद C:\Users\%username%\AppData\Local\lxss\root\.bashrcअब पथ जोड़ने के लिए फ़ाइल को संपादित करें ?
पीटर

@Peter वह अस्तित्व में नहीं है (मेरे पास स्थानीय के नीचे 'lxss' नहीं है)
Cody S

1
इसे एड्रेस बार में टाइप करें, आपके पास यह होना चाहिए। अन्यथा, छिपे हुए सिस्टम फ़ोल्डर दिखाएं। छिपे हुए फ़ोल्डर्स को सक्षम करना पर्याप्त नहीं है। देखें superuser.com/questions/1108483/...
पीटर

आह, तुम सही हो ... लेकिन अब मुझे यकीन नहीं है कि यह मेरी समस्या है। मैं अपने प्रश्न का संपादन करने जा रहा हूं
कोडी एस

1
आप बैश में विंडोज मावेन क्यों चलाते हैं? विंडोज पर बैश लिनक्स के अंदर चलता है और केवल देशी लिनक्स बायनेरी चला सकता है। Cygwin के विपरीत आप इसमें Windows exe फ़ाइलों को निष्पादित नहीं कर सकते हैं, जो कि देशी Windows binaries चलाने के लिए उपयोग किया जाता है
phuclv

जवाबों:


6

अद्यतन सारांश

विचाराधीन निष्पादनयोग्य लिनक्स मूल प्रारूप (ईएलएफ) नहीं हैं, वे खिड़कियों के लिए संकलित हैं। पथ विस्तार के दौरान, बश बाइनरी की जादुई संख्या की जांच करता है, अगर यह ईएलएफ के लिए मैच नहीं है, तो यह पथ विस्तार के माध्यम से उजागर नहीं करता है। हालांकि, खिड़कियों के लिए बैश में बैश वातावरण से देशी विंडोज़ अनुप्रयोगों को लॉन्च करने की क्षमता शामिल थी, यही वजह है कि प्रत्यक्ष निष्पादन (पथ विस्तार के बिना और बाद में बाइनरी चेक) ठीक काम करता है।

रिज़ॉल्यूशन या तो एक उर्फ ​​आधारित है .bashrc अलावा (या किसी भी वैकल्पिक तरीकों की संख्या के विस्तार की नकल करने के लिए इस प्रकार बैश फ़ाइल मूल्यांकन को दरकिनार) या लिनक्स संस्करण की स्थापना।


मूल उत्तर

फ़ाइल अनुमतियाँ

यह संभवतः एक क्रॉस फ़ाइल सिस्टम अनुमतियाँ समस्या है। यदि आप cd /mnt/c/Program\ Files/apache-maven-3.3.9/binऔर mvan चलाने की कोशिश करते हैं तो ./mvnक्या होता है?

ls -altउस डायरेक्टरी में आउटपुट क्या है ?

यदि फ़ाइल ठीक से निष्पादन योग्य के रूप में चिह्नित नहीं की गई है, तो यह आपके पथ पर 'प्रोग्राम' के रूप में दिखाई नहीं देगी। यदि यह एक द्विआधारी फ़ाइल है और 'linux' प्रारूप (ELF) में नहीं है, तो यह पथ निष्पादन योग्य के रूप में भी दिखाई नहीं देगा।

यदि सीधे mvn को निष्पादित करना काम नहीं करता है (कृपया ls परिणाम पोस्ट करें), निष्पादित अनुमतियाँ जोड़ने का प्रयास करें chmod ug+x mvn

गलत संस्करण स्थापित किया गया

क्या आप सुनिश्चित हैं कि आपके पास लिनक्स देशी संस्करण स्थापित है - वही संस्करण जिसे आपने साइबरविन के साथ उपयोग किया था, लगभग निश्चित रूप से काम नहीं करेगा।

आप बाइनरी कम्पैटिबिलिटी की जांच कर सकते हैं और sudo apt-get install elf-binutils फिर फाइल पर mvan कमांड का उपयोग करें। readelf -a mvn यदि आपको कोई त्रुटि मिलती है जैसे कि 'Not a ELF फाइल ...' तो आपके पास आपका उत्तर होगा।

मैंने अभी देखा कि आपने अपने उदाहरण में परीक्षण शेल स्क्रिप्ट के लिए अनुमतियों को नहीं जोड़ा था, जो (जब तक आप केवल चरण को सूचीबद्ध करना नहीं भूल गए थे), पूरी तरह से उस विशेष विफलता की व्याख्या करता है।

सारांश:

  1. सुनिश्चित करें कि मावेन बिन डायरेक्टरी में एक्जीक्यूटिव्स को ठीक से चामोड का उपयोग करके निष्पादन योग्य के रूप में सेट किया गया है। अपने उत्तर में ls -alt का आउटपुट पोस्ट करें।
  2. सुनिश्चित करें कि आपके पास एक लिनक्स बाइनरी है - सत्यापित करने के लिए उपयोगिता का उपयोग करें।
  3. अपना शेल स्क्रिप्ट परीक्षण फिर से चलाएँ, लेकिन इस बार फ़ाइल निष्पादन योग्य चिह्नित करें।

अपडेट करें

पथ मुद्दा एक लाल हेरिंग था; आप बस एक द्विआधारी प्रारूप को निष्पादित करने की कोशिश कर रहे हैं जो विंडोज़ पर्यावरण पर लिनक्स के साथ संगत नहीं है।

सतह पर दो वातावरण (खिड़कियों पर साइबर और बैश) कुछ हद तक समान उपयोगकर्ता अनुभव प्रदान करते हैं लेकिन कार्यान्वयन और परिणामस्वरूप द्विआधारी संगतता बहुत अलग हैं।

निचला रेखा - साइगविन और लिनक्स बाइनरी प्रारूप संगत नहीं हैं। खिड़कियों पर बैश से इसे चलाने के लिए आपको लिनक्स के मूल संस्करण को स्थापित करने की आवश्यकता है। आप इसे विंडोज़ वातावरण पर बैश के अंदर स्रोत से भी संकलित कर सकते हैं; लेकिन पर्यावरण के 'शुरुआती दिनों' की वजह से मैं निर्भरता का पीछा करने के बारे में चिंता करूँगा।

दो परिवेशों का संक्षिप्त विवरण:

साइगविन प्रभावी रूप से एक अनुवाद परत है जो सिस्टम कॉल के लिए एक एपीआई प्रदान करती है जो आमतौर पर गैर-पॉसिक्स सिस्टम पर उपलब्ध नहीं होती है, जो आपको विंडोज़ वातावरण में लिनक्स पर चलने के लिए लिखे गए कई कार्यक्रमों को संकलित करने की अनुमति देती है। हालाँकि यह अभी भी 'विंडोज़' के वातावरण में चल रहा है - यह कि बाइनरी अब केवल विंडोज़ पर साइबरविन वातावरण में काम करेगी। यह ट्रांसलेशन लेयर और संबद्ध लाइब्रेरी लिनक्स एपीआई के खिलाफ लिखे गए सोर्स कोड को साइबरविन माहौल में संकलित करने और खिड़कियों पर चलाने की अनुमति देती है। इस तरह से निर्मित बायनेरिज़ मूल रूप से लिनक्स या विंडोज पर नहीं चलेंगे; केवल साइबर माहौल में।

विहित द्वारा प्रदान की गई खिड़कियों पर बैश का माहौल साइबरविन की तुलना में बहुत अलग है। यह वास्तविक रूप से एक प्रोग्राम के लिए एक वातावरण को 'रीक्रिएट' करता है जो वास्तव में लिनेक्स प्रतीत होता है - अर्थात मानक पुस्तकालय पुसेस प्रणाली कॉल के साथ उपलब्ध हैं - बिना बायनेरिज़ के किसी भी संशोधन की आवश्यकता के बिना। कई मामलों में ubuntu के खिलाफ बनाया गया एक द्विआधारी को विंडोज़ के वातावरण पर सीधे बैश में कॉपी किया जा सकता है और बिना किसी समस्या के चलाया जा सकता है।

खिड़कियों पर बैश में एक वैध निष्पादन योग्य के रूप में पहचाने जाने के लिए इसे मूल लिनक्स बाइनरी प्रारूप या इसे व्याख्या करने के लिए प्रोग्राम के साथ चिह्नित एक स्क्रिप्ट फ़ाइल की आवश्यकता होती है (बैश स्क्रिप्ट के लिए, #! / Bin / bash)। एक मूल लिनक्स बाइनरी लिनक्स लाइब्रेरी और सिस्टम कॉल के खिलाफ बनाया गया होगा। बैश इस बात की पुष्टि करता है कि निष्पादन योग्य अनुमति बिट्स की जाँच करके और बाइनरी फ़ाइल प्रारूप की जाँच करने के लिए दोनों एक मान्य निष्पादन योग्य है (एक 'मैजिक नंबर' चेक)। यदि यह एक बाइनरी फ़ाइल है और ईएलएफ प्रारूप में नहीं है, तो यह पथ विस्तार के माध्यम से शेल के संपर्क में नहीं है।

इस समस्या को स्पष्ट करने के लिए, उन्होंने खिड़कियों पर बैश से देशी विंडोज़ अनुप्रयोगों को लॉन्च करने के लिए आंशिक क्षमता जोड़ी है, लेकिन स्पष्ट रूप से बैश पथ विस्तार बाइनरी फ़ाइल प्रारूप जांच को संबोधित नहीं किया - या उन्होंने किया और यह एक बग है।

दूसरा संपादन:

आपके प्रश्न पर स्पष्टीकरण:

जब आप इसे सीधे लॉन्च करते हैं (./Mvn) तो यह बैश मूल्यांकन को दरकिनार कर देता है और बस इसे निष्पादित करता है। विंडोज़ के पर्यावरण पर होने वाली मारपीट, विंडोज़ देशी निष्पादन योग्य वस्तुओं को लॉन्च करने के लिए पर्याप्त है, जो कि होनी चाहिए। मुझे विश्वास नहीं है कि एक साइबर बाइनरी बैश से ठीक से लॉन्च होगी, लेकिन मैं गलत हो सकता है - इस बिंदु पर दस्तावेज़ीकरण छोटा है और मेरे पास अभी एक परीक्षण वातावरण उपलब्ध नहीं है।

'पथ' समर्थन के लिए समकक्ष क्षमता प्रदान करने वाला वर्कअराउंड:

यदि आप मावेन इंस्टॉलेशन के साथ पूरी तरह से खुश हैं (कोई अन्य संगतता मुद्दे नहीं हैं, तो सब कुछ बस 'काम करता है'), लेकिन रास्ते में होने के लिए यह महत्वपूर्ण है, आप एक सरल वर्कअराउंड का उपयोग कर सकते हैं जो समकक्ष क्षमता प्रदान करेगा।

अपनी .bashrc फ़ाइल में, निम्न उपनाम जोड़ें:

alias mvn='/mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn'

उस निर्देशिका में किसी भी अन्य निष्पादनयोग्य के लिए समकक्ष दोहराएं जिसे आप विंडो वातावरण पर बैश में कहीं से भी एक्सेस करना चाहते हैं।

फ़ाइल को पुनः आरंभ करें या फ़ाइल को स्रोत करें, और फिर mvnकिसी भी निर्देशिका से काम करेंगे (आपके कथन के अनुसार कि बिन dir, / .mvn के भीतर से प्रत्यक्ष निष्पादन काम कर रहा था)।


फ़ाइल निष्पादन योग्य है, लेकिन यह एक ELF फ़ाइल नहीं है ... लेकिन बिल्ली क्या है? Cygwin इस बाइनरी को क्यों चला सकता है लेकिन BUW नहीं कर सकता है? और अगर मैं निर्देशिका में नेविगेट करता हूं, तो मैं अभी भी निष्पादित कर सकता हूं ।/mvn, और यह निष्पादित करता है, और यह मेरे रास्ते पर है, लेकिन BUW इसे स्वीकार करने से इनकार करता है। ईएलएफ फ़ाइल होने / न होने का पाथ व्यवहार से कोई लेना-देना क्यों नहीं है?
कोडी एस

जैसा कि मैंने कहा, साइग्विन एक विंडोज़ वातावरण है, और केवल विंडोज़ ऐप चला सकते हैं। बैश एक लिनक्स वातावरण है और केवल लिनक्स देशी ऐप चला सकते हैं। वे अलग वातावरण हैं। बस एक देशी उबंटू इंस्टॉल से कुछ ऐप को कॉपी करें और इसे बैश में कॉल करने की कोशिश करें, यह बिना किसी समस्या के चलेगा। लेकिन आप bash में विंडोज ऐप नहीं चला सकते। यदि आप वास्तविक बैश में दौड़ना चाहते हैं तो आपको लिनक्स के लिए फिर से
मावेन की आवश्यकता है

मुझे "Not a ELF फ़ाइल" परिणाम भी मिलता है, भले ही मैंने एक अन्य लिनक्स मशीन से मावेन की नकल की हो। जब मैं mvan चलाता हूं तो मुझे कोई प्रतिक्रिया नहीं मिलती है। जावा कार्य प्रबंधक में एक जावा प्रक्रिया दिखाई देती है, जिसे अंततः मुझे मारना पड़ता है ताकि "मार" की प्रतिक्रिया बैश में मिल सके। अगर मैं "/ mnt / c / Program Files (x86) / Maven / bin" से मावेन को चलाने का प्रयास करता हूँ तो मुझे भी ठीक वैसा ही व्यवहार मिलता है। कोई विचार?
पापड़ी

0

प्रयास करें echo 'PATH="~/pathTest/:$PATH"' > ~/.bash_path(कोई भी नाम जो आप चाहते हैं)

source ~/.bash_path

echo $PATH यह देखने के लिए कि क्या कुछ बदलता है

chmod +x ~/pathTest/pathTestScript.sh इसे सीधे चलाने के लिए, आपको फ़ाइल में सही निष्पादित करना होगा।

pathTestScript.sh

इस काम करता है, बस लाइन जोड़ने source ~/.bash_pathआप में ~/.bashrc

आप द्वारा आह्वान कर सकते हैं /mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn?


मैं द्वारा आह्वान कर सकता हूं /mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn, और मैंने binपीएटीएच में जोड़ा है , लेकिन मैं अभी भी which mvnसफलतापूर्वक नहीं कर सकता , जो मुझे कोई मतलब नहीं है।
कोडी एस

अजीब। जब आप उत्तर खोज रहे हों तो बेहतर करने के लिए, आप इनवोक को थोड़ा सरल बनाने के लिए लिनक्स उर्फ ​​की कोशिश कर सकते हैं। linfo.org/alias.html
Roden Luo

0

चूंकि यह उबंटू पर आधारित है, वास्तविक PATH फ़ाइल " /etc/environment" है (फ़ाइल प्रकार नहीं दिखाता है)।

$ nano /etc/environmentफ़ाइल को संपादित करने का सबसे आसान तरीका है। आप कुछ इस तरह देखेंगे:

पथ = "/ usr / स्थानीय / sbin: / usr / स्थानीय / बिन: / usr / sbin: / usr / bin: / sbin: / बिन: / usr / खेल: / usr / स्थानीय / खेल"

आप अंतिम निर्देशिका के बाद, अंतिम निर्देशिका के बाद, पिछली निर्देशिका :से परिसीमन करने के लिए आपके द्वारा चुनी गई निर्देशिका को जोड़ सकते हैं ।

अंत में आपको फ़ाइल " /etc/environment" चलानी होगी ; इसे निम्न प्रकार से पूरा किया जा सकता है:

$ . /etc/environment

मैं इन में भाग गया $ sudo -sऔर साथ की जाँच की $ env। मुझे कुछ हद तक भरोसा है कि एनवी कमांड को तत्काल बदलाव दिखाने चाहिए, और चयनित बदलाव किए जाने के बाद पुनः आरंभ करना चाहिए।


मैंने अपने प्रश्न को एक परिदृश्य के साथ संपादित किया है, लेकिन जब मैंने /etc/environmentफ़ाइल में ~ / pathTest जोड़ा , तो मेरी फ़ाइल पथ में जोड़ी नहीं गई। आपका हल काम नहीं करता है।
कोडी एस

~ का उपयोग न करें; पूर्ण पथ का उपयोग करें। इसे सही निर्देशिका में टाइपिंग pwd के माध्यम से प्राप्त करें
djsmiley2kStaysInside

मैंने नहीं किया। फिर भी काम नहीं करता है। क्षमा करें, मैं देख सकता हूं कि यह कैसे भ्रामक हो सकता है, लेकिन नहीं, मैं अपने env रास्तों में ~ का उपयोग नहीं करता, मैं हमेशा उनका विस्तार करता हूं
कोडी S

मैंने अभी-अभी फीचर का पुनर्स्थापना किया है और मुझे लग रहा है कि मेरा उत्तर पर्याप्त नहीं है और केवल विशेष सत्र के लिए अस्थायी रूप से परिवर्तन करता है। मैं कुछ और खोज रहा हूं। सॉरी कोडी।
क्रिस बर्नार्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.