realpath कमांड नहीं मिला


24

मेरे पास डेबियन निचोड़ है amd64। मेरा वर्तमान शेल बैश है। यदि मैं अपने टर्मिनल में निम्नलिखित लिखता हूं, तो यह काम करता है:

$ uname -a
Linux core 2.6.32-5-amd64 #1 SMP Fri May 10 08:43:19 UTC 2013 x86_64 GNU/Linux
$ echo $SHELL
/bin/bash                                                                                                                                                                                     
$ echo $(realpath test.sh)                                                                                                                                                     
/home/ffortier/test.sh

मेरी test.sh फ़ाइल इस प्रकार है:

#!/bin/bash
echo $(realpath "$1")

यदि मैं निम्नलिखित को निष्पादित करने का प्रयास करता हूं, तो मुझे एक त्रुटि मिलती है

$ ./test.sh test.sh 
./test.sh: line 2: realpath: command not found

मैं bash फ़ाइल के भीतर realpath कमांड का उपयोग कैसे कर सकता हूं?

अतिरिक्त जानकारी

$ type -a realpath
realpath is a function                                                                                                                                                                        
realpath ()                                                                                                                                                                                   
{                                                                                                                                                                                             
    f=$@;                                                                                                                                                                                     
    if [ -d "$f" ]; then                                                                                                                                                                      
        base="";                                                                                                                                                                              
        dir="$f";                                                                                                                                                                             
    else                                                                                                                                                                                      
        base="/$(basename "$f")";                                                                                                                                                             
        dir=$(dirname "$f");                                                                                                                                                                  
    fi;                                                                                                                                                                                       
    dir=$(cd "$dir" && /bin/pwd);                                                                                                                                                             
    echo "$dir$base"                                                                                                                                                                          
}           

जवाबों:


9

Realpath एक वास्तविक कमांड या एक स्क्रिप्ट है? मैं यह देखने के लिए जाँच करूँगा कि यह कहाँ से आ रहा है।

$ type -a realpath

मैं इस उपकरण से परिचित नहीं हूँ, और इसलिए यह आपके सामान्य वितरण का हिस्सा नहीं है, शायद यह एक गैर-मानक स्थान पर स्थापित है जो बैश पर मौजूद नहीं है $PATHलेकिन आपके लॉगिन वातावरण के भीतर है $PATH

किसी भी घटना में, उपरोक्त typeकमांड आपको दिखाएगी कि कमांड कहाँ से आ रही है, जिस बिंदु पर आप उस विधि को बदल सकते हैं जिसे आप अपनी स्क्रिप्ट में कॉल कर रहे हैं:

echo $(/path/to/realpath test.sh)

या अपनी स्क्रिप्ट में संशोधन करें $PATHताकि इसमें यह गैर-मानक स्थान भी शामिल हो।

शेल में कार्य

जब आप किसी शेल स्क्रिप्ट का आह्वान करते हैं तो आपका अधिकांश वातावरण नहीं मिलता है। यदि आप इस बारे में सोचते हैं, तो यह बहुत मायने रखता है, क्योंकि आप आमतौर पर स्क्रिप्ट नहीं चाहते हैं कि उपयोगकर्ता के पर्यावरण के लिए अतिरिक्त सामान हो।

आप या तो यह निर्धारित कर सकते हैं कि कौन सी स्रोत फ़ाइल यह फ़ंक्शन प्रदान कर रही है और या तो स्रोत, या बस अपने लॉगिन वातावरण को शामिल करने के लिए बैश का निर्देश दें।

#!/bin/bash -l
echo $(realpath "$1")

यह एक समारोह है, संपादित करें
फ्रांसिस

जब आप अपनी स्क्रिप्ट को लागू करते हैं तो @Francis - हाँ फ़ंक्शन शामिल नहीं हैं। यदि आप चाहते हैं कि आप उन्हें साथ आना चाहते हैं, तो आपको उन्हें स्रोत करना होगा। पता लगाएँ कि कौन सी फ़ाइल फ़ंक्शन प्रदान कर रही है और इसे स्रोत। अगर आप सिर्फ अपना पूरा एनवी चाहते हैं। तो, पार्टी के लिए अपने कॉल में संशोधन #!/bin/bash -l
स्लम

मुझे कैसे पता चलेगा कि यह फ़ंक्शन कहां से आता है?
फ्रांसिस

1
@mikeserv - धन्यवाद, जब मैंने इसे लिखा तो मैं अभी भी फेडोरा 14 का उपयोग कर रहा था जिसमें शामिल नहीं था realpath। माय फेडोरा 19 सिस्टम में अब यह टूल शामिल है। यह भी ध्यान दें कि ओपी एक डेबियन w / 2.6 कर्नेल का उपयोग कर रहा था, इसलिए उसकी प्रणाली भी realpathअपनी उम्र को देखते हुए गायब हो गई होगी ।
SLM

1
@mikeserv - हाँ, मैं हैरान था, यह अब एक पुराना-ईश क्यू है, लेकिन इसके बारे में जानकारी commandअभी भी मेरे लिए उपयोगी थी। यह एक और अधिक पोर्टेबल तरीका है जो मैं POSIX गोले में दिखा रहा था।
SLM

27

कम से कम दो कार्यक्रम हैं realpath:

  • जब GNU कोरुटिल्स शामिल नहीं थे, तो पीछे से एक पुराना कार्यक्रम readlink -f। अब इसके पक्ष में पदावनत कर दिया गया है readlink -f, इसलिए कई वितरणों ने इसे ले जाना बंद कर दिया है।
  • realpathकार्यक्रम जीएनयू में शुरू की गई 8.15 coreutils। यह डेबियन निचोड़ या मट्ठा में होने के लिए बहुत पुराना है; लेखन के समय, डेबियन अस्थिर इसे या तो जहाज नहीं करता है । यह कार्यक्रम बहुत करीब है readlink -f

किसी कारण से, आपके पास एक शेल फ़ंक्शन है जो आंशिक रूप से व्यवहार का अनुकरण करता है realpath। यह अनुकरण आंशिक है: यदि आप इसे प्रतीकात्मक लिंक पर कहते हैं, तो यह प्रतीकात्मक लिंक का अनुसरण नहीं करता है।

चूँकि यह एक शेल फंक्शन है, संभवतः या इससे लोड किया गया है .bashrc, यह केवल आपके इंटरेक्टिव शेल में चल रहे कोड के लिए उपलब्ध है। यदि आप चाहते हैं कि यह अन्य कार्यक्रमों के लिए उपलब्ध हो, तो मान लें कि आप लिनक्स चला रहे हैं, एक स्क्रिप्ट बनाएं जो अनुकरण करता है realpath:

#!/bin/sh
readlink -f -- "$@"

(यह realpathशायद ही कभी इस्तेमाल की जाने वाली कमांड लाइन के विकल्प का अनुकरण नहीं करता है ।)


2
मुझे कोरुटिल्स गिट रेपो में कोई सबूत नहीं मिल रहा है कि realpathकार्यक्रम को कोर्यूटिल्स द्वारा पदावनत माना जाता है, या यह कि यह डिफ़ॉल्ट रूप से नहीं बनाया गया है। इसलिए डेबियन को इसे हटाना होगा।
काज

@ काज़ ओह, ठीक है, बस मामलों को जटिल करने के लिए, कोरुटिल्स ने हाल ही में (8.15) एक realpathबाइनरी पेश किया , जो करीब है लेकिन इसके समान नहीं है readlink -f। डेबियन स्थिर वहन करता है 8.13। डेबियन अस्थिर ने विरासत कार्यक्रम रखने के लिए चुना
गिल्स एसओ- बुराई को रोकना '

यह नहीं था कि हाल ही में - यह जनवरी 2012 था savannah.gnu.org/forum/forum.php?forum_id=7076
mikeserv

1
@mikeserv दूर प्रश्न में वितरण के लिए हाल ही में (डेबियन निचोड़)। यहां तक ​​कि वर्तमान डेबियन स्थिर के लिए भी हाल ही में।
गिलेस एसओ- बुराई को रोकना '

यह थोड़े डरावना है। उनकी आयु कितनी है openssl?
mikeserv

8

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

इसलिए या तो realpathपैकेज से स्थापित करें , अपने स्वयं के फ़ंक्शन को परिभाषित करें (स्क्रिप्ट के भाग के रूप में, कुछ उदाहरणों की जांच करें ) या अपनी स्क्रिप्ट में आरसी फ़ाइल को स्रोत जहां इसे परिभाषित किया गया है (जैसे . ~/.bashrc)।


realpathयदि यह मौजूद नहीं है, तो यहां स्थापित करने के लिए चरण हैं :

  • उबंटू: sudo apt-get install coreutils
  • OS X: brew install coreutils

उबंटू और डेबियन

डेबियन या उबंटू पर ऐसा लगता है कि इसे realpathडिफ़ॉल्ट रूप से स्थापित किया जाना चाहिए। मैंने हाल ही में डेबियन 8 (जेसी) में जाँच की है और यह coreutilsडिफ़ॉल्ट रूप से स्थापित किया गया है।

VM की ताज़ा छवियों का उपयोग करके परीक्षण किया गया:

$ vagrant init debian/jessie64 && vagrant up --provider virtualbox && vagrant ssh
$ vagrant init ubuntu/vivid64 && vagrant up --provider virtualbox && vagrant ssh

फिर वीएम में:

$ type -a realpath
realpath is /usr/bin/realpath

इसके बजाय realpath, आप पैकेज द्वारा प्रदान की गई readlink -f file(या greadlink) का भी उपयोग कर सकते हैं coreutils


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.