$ PATH पर्यावरण चर में प्रतिशत


16

मेरा $ पेट ऐसा दिखता है:

/home/torbjorr/deployed/vector/x86_64-GNU%2fLinux:/home/torbjorr/deployed/typewriter/x86_64-GNU%2fLinux:/home/torbjorr/deployed/mustudio/x86_64-GNU%2fLinux:/home/torbjorr/deployed/mathext/x86_64-GNU%2fLinux:/home/torbjorr/deployed/doxymax/x86_64-GNU%2fLinux:/home/torbjorr/deployed/c2tex/x86_64-GNU%2fLinux:/home/torbjorr/deployed/x86_64-GNU%2fLinux/wand:/home/torbjorr/deployed/x86_64-GNU%2fLinux/spellesc:/home/torbjorr/deployed/x86_64-GNU%2fLinux/projinit:/home/torbjorr/deployed/x86_64-GNU%2fLinux/herbs:/home/torbjorr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

बैश में, मैं समस्या के बिना भटक सकता है जिसमें स्थित है

/home/torbjorr/deployed/x86_64-GNU%2fLinux/wand

पसंद

$ wand
(i) Mål från "main.cpp" har registrerats
(i) Skapar katalog "__wand_targets_dbg"
(i) Kör g++ "main.cpp" -fpic -L"/home/torbjorr/deployed"  -g -Wall -std=c++11 -I"/home/torbjorr/deployed" -o "__wand_targets_dbg/cb-template

हालाँकि, बोर्न शेल कम्पैटिबिलिटी मोड में, वैंड नहीं मिल सकता है:

$ wand
sh: 2: wand: not found

ऐसा लगता है कि समस्या इन रास्तों में% संकेत है। यह संकेत URL एन्कोडिंग द्वारा जोड़ा गया है, इसलिए "GNU / Linux" नाम का उपयोग निर्देशिका नाम में किया जा सकता है, भले ही यह एक वैध फ़ाइल नाम न हो। क्या यह संभव है कि नाम श में काम कर रहा हो, या श कमांड को बैश के रूप में काम करता है। यानी, बैश को वैसा ही व्यवहार करें भले ही यह / बिन / श कमांड के साथ लागू किया गया हो, जो वैसे भी बैश करने के लिए सहानुभूति रखता है।


अच्छा प्रश्न। ऐसा लगता है कि $ PATH में '%' वर्ण सही तरीके से काम नहीं कर रहा है sh(यह ठीक है bashऔर zshहालांकि)। सीधे निष्पादन योग्य कार्यों को कॉल करना sh; बहुत अजीब।
रमनो

यदि आप 2 %% का उपयोग करते हैं तो क्या होगा?
mikeserv

या% बच कर?
mdpc

जवाबों:


15

यह बॉर्न शेल नहीं है, या बॉर्न शेल का bashअनुकरण करते हुए, यह अल्मक्विस्ट शेल है, आपके मामले में संभवतः डेबियन अल्मक्विस्ट शेल (बीएसडी के डीबिन द्वारा एक लिनक्स फोर्क जो मूल अल्मक्विस्ट शेल पर आधारित है)।

अलमक्विस्ट शेल (मूल एक और आधुनिक संस्करण) में, विशिष्ट सुविधाओं के लिए %उपयोग किया जाता PATHहै ash। प्रलेखन से उद्धरण:

पथ खोज

जब एक कमांड का पता लगाते हैं, तो शेल पहले यह देखता है कि क्या उस नाम से शेल फ़ंक्शन है या नहीं। फिर, यदि PATH के लिए कोई प्रविष्टि नहीं है %builtin, तो यह उस नाम से एक अंतर्निहित आदेश के लिए दिखता है। अंत में, यह PATH में प्रत्येक प्रविष्टि को कमांड के बदले में खोजता है।

पेट वैरिएबल का मान कॉलन द्वारा अलग की गई प्रविष्टियों की एक श्रृंखला होना चाहिए। प्रत्येक प्रविष्टि में एक निर्देशिका नाम या एक निर्देशिका नाम होता है जिसके बाद एक ध्वज चिह्न होता है जिसमें प्रतिशत चिह्न होता है। वर्तमान निर्देशिका को खाली निर्देशिका नाम से इंगित किया जाना चाहिए। यदि कोई प्रतिशत हस्ताक्षर मौजूद नहीं है, तो प्रविष्टि शेल को निर्दिष्ट निर्देशिका में कमांड की खोज करने का कारण बनाती है। यदि झंडा है %builtin तो शेल बिलिन कमांड की सूची खोजी गई है। यदि झंडा है %func तो निर्देशिका को एक फ़ाइल के लिए खोजा जाता है जिसे शेल के इनपुट के रूप में पढ़ा जाता है। इस फ़ाइल को एक फ़ंक्शन को परिभाषित करना चाहिए जिसका नाम कमांड के लिए खोजा जा रहा है।

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

अन्य गोले की तरह kshया zshकार्यों तंत्र की एक ऐसी ही autoloading है, लेकिन वे एक अलग चर (का उपयोग $FPATH), लेकिन आप को परिभाषित नहीं कर सकते जो कार्य या निष्पादनयोग्य की प्रधानता मिलती है।

आपके मामले में, ध्वज के साथ निर्देशिका के /home/torbjorr/deployed/vector/x86_64-GNU%2fLinuxरूप में व्याख्या की गई है । उस झंडे को अनदेखा कर दिया जाता है क्योंकि वह अज्ञात है।/home/torbjorr/deployed/vector/x86_64-GNU2fLinux

उसके आसपास कोई रास्ता नहीं है। यहां तक ​​कि अगर राख में एक भागने का तंत्र था, ताकि यह %विशेष रूप से इलाज न किया जाए, तो यह अन्य गोले या अन्य चीजों में काम नहीं करेगा जो कि ऊपर दिखते $PATHहैं execvp()

आपको %वर्णों को हटाने की आवश्यकता होगी $PATH, इसलिए अपनी निर्देशिका का नाम बदलें या एक सिमलिंक जोड़ें।

या ashआपके लिए उपयोग न करें /bin/sh। अन्य हल्के POSIX शेल कार्यान्वयन जो ऐसा नहीं करते yashऔर शामिल हैं mksh


हालांकि यह जवाब एक स्पष्टीकरण देता है, यह एक समाधान नहीं देता है। % रखने का संगत तरीका है।
user877329

@ user877329, यहां कोई वास्तविक समाधान नहीं है। मेरा संपादन देखें।
स्टीफन चेज़लस

3
दूसरे शब्दों में, डेबियन shPOSIX मानक का उल्लंघन करता है। यह देखते हुए कि अलग होने की बात shठीक है कि आपको कुछ असंगत शेल एक्सटेंशन पर यात्रा करने के लिए सुनिश्चित नहीं होना चाहिए (मुझे लगता है कि /bin/shइन दिनों लॉगिन शेल के रूप में कोई भी उपयोग नहीं करता है ), मैं समझता हूं कि बग।
celtschk

1
@celtschk, इस बात से सहमत है कि ash/ बिन / श के लिए उपयोग करने के बिंदु का उपयोग करने के प्रदर्शन के दंड से बचने के लिए अधिक है bash, इसलिए उपयोग करना yashया mksh(या poshयदि आप सभी एक्सटेंशनों को बाहर करना चाहते हैं) अभी भी उपयोग करने से बेहतर विकल्प है bash। इसके अलावा, कोई इसे एक कोने का मामला मान सकता है। %पथ घटक में कोई भी सामान्य रूप से नहीं होगा । अधिकांश गोले में कोने के मामले होते हैं जहां वे पोसिक्स अनुपालन नहीं करते हैं।
स्टीफन चेजलस

1
@mmmiller, यह नहीं है कि मैंने पोर्टेबल फ़ाइल नाम वर्ण सेट (PFCS) का अर्थ कैसे पढ़ा । POSIX प्रोग्रामिंग API को निर्दिष्ट करता है, लेकिन फाइलसिस्टम कार्यान्वयन को नहीं। PFCS न्यूनतम POSIX गारंटी है जो कि फाइलसिस्टम, चाहे जो भी हो, वर्तमान लोकेल पर काम करेगा लेकिन टूल के लिए कोई बहाना नहीं है, यदि फाइल सिस्टम द्वारा समर्थित हो और मौजूदा लोकल में मान्य हो तो किसी फाइलनाम में कैरेक्टर को स्वीकार नहीं करना चाहिए। उदाहरण के लिए POSIX की आवश्यकता है, [भले ही वह वर्ण PFCS में न हो।
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.