जब प्रतीकात्मक लिंक के माध्यम से कॉल किया जा सकता है तो निष्पादन योग्य सही फ़ाइलें नहीं मिल सकती हैं


3

मैंने एक निष्पादन योग्य के साथ एक प्रतीकात्मक लिंक बनाया

ln -s /usr/bin/mydir/myexec /usr/bin/myexec

जब मैंने अमल किया myexec बैश में, यह उन उचित फ़ाइलों को लोड नहीं करता है जो मूल में स्थित हैं myexec निर्देशिका है।

ऐसा क्यों हो रहा है और मैं इसे कैसे हल कर सकता हूं? मैं फेडोरा 15 x64 पर हूं।

जवाबों:


3

वे फ़ाइलें जिन्हें सापेक्ष पथों के साथ कहा जाता है /usr/bin/mydir/myexec वर्तमान कार्यशील निर्देशिका के सापेक्ष खोजा जाएगा जहां से स्क्रिप्ट निष्पादित की गई है। संभवत: आपकी स्क्रिप्ट वर्तमान में केवल तभी काम करती है जब इसे निष्पादित किया जाता है /usr/bin/mydir इस समय।

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

THISFILE=$(readlink -f -- "${0}")
THISDIR=${THISFILE%/*}
. "${THISDIR}/my_settings_file"
  • readlink -f सिम्लिंक के लक्ष्य को वापस करेगा।
  • ${THISFILE%/*} पिछले और उसके बाद के हिस्से के साथ सिम्लिंक के लक्ष्य को वापस करेगा / हटा दिया गया, अर्थात् प्रश्न में फ़ाइल का पथ।
  • ${THISDIR} अब फ़ाइल में पूर्ण पथ समाहित है, और इसका उपयोग पंक्ति 3 के रूप में किया जा सकता है।

मैंने एक शेल स्क्रिप्ट से संबंधित प्रश्न ग्रहण किया। अन्य भाषाओं में अलग-अलग विधियाँ हो सकती हैं।


इसे हल करने का एक और तरीका जो समस्या को कम या ज्यादा पूरी तरह से दूर करता है, वह है अपने रास्ते में बाइनरी को समेटने के बजाय, एक छोटी सी स्क्रिप्ट बनाएं /usr/bin/myexec जिसमें उदा।

#!/bin/sh
cd /usr/bin/mydir
./myexec

1

मैं @ डैनियल-एंडरसन से असहमत हूं। मुझे नहीं लगता कि उन समाधानों को ध्यान में रखते हुए बुलाया कार्यक्रम पर तर्क दिया जाता है। लगभग सभी निष्पादक पथ निर्देशिकाओं को वर्तमान निर्देशिका के सापेक्ष मानते हैं, इसलिए यहां तक ​​कि तर्कों को पारित करने से भी काम नहीं चलने वाला है।

केवल एक मामला जिसमें कोई प्रोग्राम अलग तरीके से व्यवहार करेगा यदि उसे ए से बुलाया जाए symlink यदि यह 0 वें तर्क की जांच करता है। मुझे पता है कि सिम्कलिन का उपयोग करके इसके आसपास काम करने का कोई तरीका नहीं है। आस-पास का सबसे सरल काम एक मध्यवर्ती शेल स्क्रिप्ट बना रहा है:

#!/bin/sh
/path/to/executable/that/needs/0th/argument/to/be/actual/path $@

ध्यान दें कि यदि कुछ विचित्र कारण के लिए आपको इसे 0 वां तर्क देने की आवश्यकता है जो वास्तव में यह नहीं है कि यह कहाँ है, तो आप निष्पादन-ए का उपयोग कर सकते हैं:

#!/bin/bash
(exec -a /path/to/executable/to/fool /path/to/fool/executable/with $@)

ध्यान दें कि "-a" तर्क कड़ाई से POSIX कल्पना नहीं हो सकता है, इसलिए मैंने विशेष रूप से बैश का उपयोग किया। यह मानते हुए कि आपके रास्ते में एक ~ / बिन फ़ोल्डर है, पहला (सामान्य) मामला जल्दी से पूरा किया जा सकता है:

echo -e '#!/bin/sh\n/path/to/executable $@' > ~/bin/shortcut
chmod 755 ~/bin/shortcut
shortcut
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.