रास्ते से जोड़ना बनाम से जोड़ने / बिन


24

हमारे sys व्यवस्थापक ने सर्वर पर एक सॉफ़्टवेयर एप्लिकेशन (मावेन) स्थापित किया और सभी को /usr/local/maven/bin/फ़ोल्डर को अपने पथ पर जोड़ने के लिए कहा ।

मुझे लगता है कि उस फ़ोल्डर में कुछ प्रोग्राम्स को /binफ़ोल्डर (या अन्य फ़ोल्डर जो उनके मार्ग में है) से लिंक करना अधिक सुविधाजनक हो सकता है जैसे कि :

ln -s /usr/local/maven/bin/* /bin

क्या ये सही है? क्या मेरे सुझाव के कुछ छिपे हुए दुष्प्रभाव हैं?


2
प्रति एलएसबी के तहत आपको बाहरी पैकेज जोड़ना चाहिए /opt
वॉनब्रांड

जवाबों:


31

जोड़ने पर

आप आमतौर पर के /usr/local/*साथ लिंक नहीं करते हैं /bin, लेकिन यह एक ऐतिहासिक अभ्यास है। सामान्य तौर पर, कुछ "तकनीकी" कारण हैं कि आप वह नहीं कर सकते हैं जो आप सुझा रहे हैं।

निष्पादन योग्य लोगों के लिए लिंक बनाने से /binसमस्याएं हो सकती हैं:

  1. संभवत: सबसे बड़ी चेतावनी यह होगी कि यदि आप सिस्टम में किसी प्रकार के पैकेज मैनेजर जैसे RPM, dpkg, APT, YUM, pacman, pkg_add इत्यादि द्वारा प्रबंधित पैकेज कर रहे हैं, तो इन मामलों में, आप आमतौर पर पैकेज को जाने देना चाहते हैं। प्रबंधक अपना काम करते हैं और इस तरह के रूप में निर्देशिकाओं का प्रबंधन /sbin, /bin, /lib, और /usr। एक अपवाद वह होगा /usr/localजो आम तौर पर एक सुरक्षित स्थान होता है जैसा कि आप बॉक्स पर फिट देखते हैं, बिना पैकेज प्रबंधक के आपकी फ़ाइलों के साथ हस्तक्षेप करने की चिंता किए बिना।

  2. अक्सर बार निष्पादित किए जाने वाले निष्पादन के लिए /usr/localइस PATH को उनके निष्पादन योग्य में हार्ड-कोडित किया जाएगा। /usr/localइन अनुप्रयोगों की स्थापना के भाग के रूप में शामिल कॉन्फ़िगरेशन फ़ाइलें भी हो सकती हैं । इसलिए केवल निष्पादन योग्य से लिंक करने से इन ऐप्स के साथ समस्या हो सकती है जो .cfgबाद में फ़ाइलों को ढूंढते हैं । यहाँ इस तरह के एक मामले का एक उदाहरण है:

    $ strings /usr/local/bin/wit | grep '/usr/local'
    /usr/local/share/wit
    /usr/local/share/wit/
    
  3. .cfgफ़ाइलों को खोजने के लिए लागू होने वाला एक ही मुद्दा "सहायक" निष्पादन योग्य के साथ भी हो सकता है जिसे प्राथमिक ऐप को चलाने की आवश्यकता है। इन्हें भी लिंक करने की आवश्यकता होगी /usr/bin, यह जानते हुए कि यह समस्याग्रस्त हो सकता है और केवल तब दिखाई देगा जब आपने लिंक किए गए ऐप को निष्पादित करने का वास्तव में प्रयास किया था।

ध्यान दें: सामान्य तौर पर यह सबसे अच्छा है कि ऐप में से किसी एक को लिंक करने के प्रलोभन से बचें /usr/bin

/etc/profile.d

बल्कि तब सभी उपयोगकर्ता इस प्रबंधन को प्रदान करते हैं, व्यवस्थापक बहुत आसानी $PATHसे /etc/profile.dनिर्देशिका में एक संबंधित फ़ाइल जोड़कर बॉक्स पर सभी को जोड़ सकता है ।

इस तरह एक फ़ाइल /etc/profile.d/maven.sh:

PATH=$PATH:/usr/local/maven/bin

आप आम तौर पर एक व्यवस्थापक के रूप में ऐसा करने के बजाय सभी उपयोगकर्ताओं के सेटअप को प्रदूषित करते हैं।

विकल्पों का उपयोग करना

अधिकांश डिस्ट्रोस अब एक और टूल प्रदान करते हैं, जिसे alternatives(फेडोरा / सेंटोस) या update-alternatives(डेबियन / उबंटू) कहा जाता है, जिसका उपयोग आप उन $PATHटूल्स में लूप के लिए भी कर सकते हैं, जो बाहर हो सकते हैं /bin। इन जैसे साधनों का उपयोग करना बेहतर होता है क्योंकि ये अधिक से अधिक पालन करते हैं जो कि सबसे अधिक प्रचलित "मानक अभ्यास" पर विचार करेंगे और इसलिए सिस्टम को एक व्यवस्थापक से दूसरे में सौंपना आसान बनाता है।

यह उपकरण लिंक बनाने में एक समान काम करता है /bin; लेकिन यह इन लिंक्स के निर्माण और विनाश का प्रबंधन करता है, इसलिए जब आप सुझाव दे रहे हों, तो एक उपकरण के माध्यम से सीधे सिस्टम के इच्छित सेटअप को समझना आसान हो जाता है।

यहाँ मैं ओरेकल के जावा को एक बॉक्स पर प्रबंधित करने के लिए उस प्रणाली का उपयोग कर रहा हूं:

$ ls -l /etc/alternatives/ | grep " java"
lrwxrwxrwx. 1 root root 73 Feb  5 13:15 java -> /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.60-2.4.4.1.fc19.x86_64/jre/bin/java
lrwxrwxrwx. 1 root root 77 Feb  5 13:15 java.1.gz -> /usr/share/man/man1/java-java-1.7.0-openjdk-1.7.0.60-2.4.4.1.fc19.x86_64.1.gz
lrwxrwxrwx. 1 root root 70 Feb  5 13:19 javac -> /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.60-2.4.4.1.fc19.x86_64/bin/javac
lrwxrwxrwx. 1 root root 78 Feb  5 13:19 javac.1.gz -> /usr/share/man/man1/javac-java-1.7.0-openjdk-1.7.0.60-2.4.4.1.fc19.x86_64.1.gz
lrwxrwxrwx. 1 root root 72 Feb  5 13:19 javadoc -> /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.60-2.4.4.1.fc19.x86_64/bin/javadoc
lrwxrwxrwx. 1 root root 80 Feb  5 13:19 javadoc.1.gz -> /usr/share/man/man1/javadoc-java-1.7.0-openjdk-1.7.0.60-2.4.4.1.fc19.x86_64.1.gz

आप इसके प्रभाव देख सकते हैं:

$ type java
java is /usr/bin/java

$ readlink -f /usr/bin/java
/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.60-2.4.4.1.fc19.x86_64/jre/bin/java

मेरी $ 0.02

/binहालांकि, प्रशंसनीय के रूप में लिंक बनाना , ज्यादातर sysadmins द्वारा अत्यधिक हतोत्साहित किया जाएगा:

  1. क्योंकि यह कस्टम के रूप में देखा जाता है और किसी अन्य व्यवस्थापक को बॉक्स लेने के लिए आवश्यक होने पर भ्रम की स्थिति पैदा हो सकती है
  2. इस "नाजुक" अनुकूलन के परिणामस्वरूप भविष्य की स्थिति में एक सिस्टम टूट सकता है।

@ एसएलएम आप अपने पहले पैराग्राफ को संशोधित करना चाह सकते हैं। सिम्कलिन का उपयोग नहीं करने के कई तकनीकी कारण हैं।
जूलियाग्रे

@jlliagre - आपके ए को देखकर मुझे यकीन नहीं हो रहा है कि एडमिट्स /binडायरेक्टरी के मालिक नहीं हैं । यहाँ एक उदाहरण है। Red Hat डिस्ट्रोस पर, जो RPM का उपयोग करता है, यदि पहले से मौजूद /binRPM में कोई फाइल आपके ऊपर वर्णित नहीं है, जब तक कि --replacefilesस्विच का उपयोग करके ऐसा करने के लिए कॉक्स नहीं किया जाता है । तो यह वास्तव में एक तकनीकी कारण नहीं है। अन्य निर्देशिकाओं के साथ भी। मैं समझता हूँ कि आप OS "मालिक" के बारे में क्या कह रहे हैं, /binलेकिन यह उतना सटीक नहीं है जितना आप बता रहे हैं।
स्लम

@ जेलीगेरे - मेरे ए में भी मैं किसी को भी एक लिंक बनाने के लिए प्रोत्साहित नहीं कर रहा हूं, केवल यह कहते हुए कि अगर वे ऐसा करने का चयन करते हैं तो वे कर सकते हैं। मुझे सिस्टम से नफरत है जहां चीजें इस तरह से की जाती हैं और आमतौर पर 8 से ऐसा करने वाले एडमिन को शाप दिया जाता है)।
स्लम

@ एसएलएम वे कर सकते हैं (क्योंकि उनके पास पर्याप्त विशेषाधिकार हैं) लेकिन इसका मतलब यह नहीं है कि यह काम करेगा। मेरे उत्तर में अंक # 2 और # 3 अभी भी एक लिंक बनाने के लिए नहीं, बल्कि विशेष रूप से ओपी के मामले में सही PATH का उपयोग करने के लिए वैध तकनीकी कारण हैं। मैं आपको अपने उत्तर में उनका उल्लेख करने के लिए प्रोत्साहित करूंगा।
जुलैग्रे

@jlliagre - आपकी प्रतिक्रिया के अनुसार विवरण जोड़ा गया।
स्लम

7

पूछे गए सवालों के जवाब:

क्या ये सही है?

नहीं , यह एक खराब प्रथा है।

क्या मेरे सुझाव के कुछ छिपे हुए दुष्प्रभाव हैं?

हाँ इसके कई दुष्प्रभाव हैं। आपका सुझाव आवेदन के आधार पर काम कर सकता है या नहीं, और लंबी अवधि में फिर से प्राप्त या टूट सकता है।

ऐसे प्रतीकात्मक लिंक नहीं बनाने के लिए समझदार कारण हैं :

  • व्यवस्थापक "स्वयं" नहीं करते /bin(नोट 1 देखें) क्योंकि यह निर्देशिका ऑपरेटिंग सिस्टम / वितरण डेवलपर्स से संबंधित है। दूसरी ओर /usr/local, स्थानीय व्यवस्थापक द्वारा बनाए गए सॉफ़्टवेयर के लिए एक पारंपरिक स्थान है, /opt/<packagename>जो बिना सॉफ़्टवेयर के लिए एक है। यदि आप एक फ़ाइल या लिंक बनाते हैं /bin, तो इसके लिए एक पैकेज संस्थापन द्वारा अधिलेखित होने का जोखिम होता है, आपके मामले mavenमें OS द्वारा प्रदान किया गया एक काल्पनिक पैकेज, जो स्थानीय रूप से निर्मित एक नए से निर्मित होने पर प्रतिगमन को जन्म दे सकता है स्रोत कोड है कि OS संस्करण। उदाहरण के लिए, एसवीआर 4 pkgadd, डेबियन dpkg, रेड-हैट rpmऔर स्लैकवेयर टारबोलस सभी नेत्रहीन रूप से आपके प्रतीकात्मक लिंक को ओवरराइट करेंगे।

  • कुछ एप्लिकेशन उस जगह को देखते हैं जहां उन्हें कॉन्फ़िगरेशन फ़ाइलों, प्लगइन्स और इसी तरह के संसाधनों को पुनः प्राप्त करने के लिए कहा जाता है। यदि आप एप्लिकेशन को एक प्रतीकात्मक लिंक द्वारा कॉल करते हैं, तो इसका कोड इसका पालन करने में विफल हो सकता है और फिर इन संसाधन फ़ाइलों की तलाश /usr/binकर सकते हैं जहां वे नहीं हैं।

  • इसमें अन्य बायनेरिज़ हो सकते हैं /usr/local/maven/binऔर इस निर्देशिका को आपके पेट में नहीं जोड़ने से वे अनुपलब्ध हो जाएंगे। हटाए गए के रूप में आप पहले से ही सभी संभावित आदेशों को जोड़कर अपने आदेश के साथ खाते में ले जाते हैं।

  • Maven2 पेज अपने पथ पर इस निर्देशिका जोड़ने के लिए कहता है (ठीक: अपने पथ पर M2 वातावरण चर जोड़ें, जैसे निर्यात पथ = $ एम 2: $ पथ ।), एक अलग दृष्टिकोण का उपयोग कर अपने उस चरण तोड़ रहे हैं तो द्वारा एक असमर्थित जा रहे हैं मार्ग। बेशक, अगर सिस्टम के अधिकांश उपयोगकर्ता संभावित mavenउपयोगकर्ता हैं, तो यह PATHप्रत्येक और के बजाय विश्व स्तर पर सेट करने के लिए अधिक समझ में आता है .profile

नोट 1:

स्लैकवेयर प्रलेखन:

   The /bin directory usually doesn't receive modification
   after installation. If it does, it's usually in the form
   of package upgrades that we provide.

डेबियन / फाइलसिस्टम पदानुक्रम मानक

/bin/
   Essential command executable (binaries) for all users (e.g., cat, ls, cp) 
   (especially files required to boot or rescue the system)
...
/opt/
   Add-on application software packages 
   Pre-compiled, non ".deb" binary distribution (tar'ed..) goes here.
/opt/bin/
   Same as for top-level hierarchy

सोलारिस प्रलेखन:

/usr/bin
   Platform-dependent, user-invoked executables. These  are
   commands  users expect to be run as part of their normal
   $PATH. For executables that are different  on  a  64-bit
   system  than  on a 32-bit system, a wrapper that selects
   the  appropriate  executable   is   placed   here.   See
   isaexec(3C).  An approved installation location for bun-
   dled Solaris software. The analogous location for add-on
   system     software     or     for    applications    is
   /opt/packagename/bin.

डेबियन का सरल परीक्षण दिखा रहा dpkgहै कि मौजूदा लिंक को संरक्षित --force-overwriteनहीं किया गया है, भले ही विकल्प का उपयोग न किया गया हो:

# ls -l /usr/bin/banner
lrwxrwxrwx 1 root root 11 Feb 25 21:37 /usr/bin/banner -> /tmp/banner
# dpkg -i sysvbanner_1.0.15_amd64.deb 
Selecting previously unselected package sysvbanner.
(Reading database ... 236250 files and directories currently installed.)
Unpacking sysvbanner (from sysvbanner_1.0.15_amd64.deb) ...
Setting up sysvbanner (1.0.15) ...
Processing triggers for man-db ...
# ls -l /usr/bin/banner
-rwxr-xr-x 1 root root 11352 May  7  2009 /usr/bin/banner

वास्तव में महत्वपूर्ण है। यह काफी दुर्भाग्यपूर्ण है कि आपने एक जवाब स्वीकार किया कि गलत तरीके से यह सिर्फ एक ऐतिहासिक अभ्यास है जिसमें कोई तकनीकी कारण नहीं बचा है ...
jlliagre

1
आप सही हैं, लेकिन, मैंने उस उत्तर को स्वीकार कर लिया क्योंकि इसने मुझे एक व्यावहारिक समाधान दिया, जिसका मैंने उपयोग किया, जो कि sys के व्यवस्थापक को /etc/profile.d में PATH संशोधन कमांड डालने के लिए कहा।
एर्गल सेगल-हलेवी

मैं मानता हूं कि उन्होंने एक व्यावहारिक और सही समाधान दिया, लेकिन आपके द्वारा पूछे गए दो प्रश्नों के लिए नहीं ("क्या यह सही है? क्या कोई पक्ष है?")।
जूलियाग्रे

1
जॉलीग्रे पूरी तरह से सही है। यह प्रथा बिल्कुल भी ऐतिहासिक नहीं है। बल्कि यह एक हालिया सर्वोत्तम अभ्यास है। पुराने यूनिक्स पर इसके विपरीत सभी ने अपने सॉफ़्टवेयर के टुकड़े को सीधे /binया में स्थापित किया /usr/bin। छिपे हुए या डिस्ट्रोइड सिस्टम बायनेरिज़ (सबसे प्रसिद्ध था test) की समस्याओं की खोज करने पर, गैर-सिस्टम बायनेरिज़ को कहीं और स्थापित करने के लिए सबसे अच्छा अभ्यास प्रगतिशील रूप से अपनाया गया था।
दान

3

अगर आप सहानुभूति रखना चाहते हैं, तो बेहतर होगा कि आप सहानुभूति रखें /usr/local/bin। अपने सर्वर पर, मैं स्थानीय सॉफ़्टवेयर स्थापित करता था /opt/NAMEऔर बायनेरिज़ को सहानुभूति देता था /usr/local/bin


0

दो सुझाए गए तरीकों का एक विकल्प यह है कि इसमें एक शेल स्क्रिप्ट बनाई जाए /usr/local/bin, जिसे निष्पादित करते समय, स्क्रिप्ट में आपके द्वारा निर्दिष्ट बाइनरी को निष्पादित करें। उदाहरण के लिए, एक उदाहरण के रूप maven का उपयोग कर, मैं में एक खोल स्क्रिप्ट पैदा करेगा /usr/local/binबुलाया mavenMaven द्विआधारी जहां यह स्थित है निष्पादित और इसे करने के लिए किसी भी तर्क पारित करने के लिए एक छोटे से स्क्रिप्ट के अंदर है:

#!/bin/sh
exec /usr/local/maven/bin/maven "$@"

यह आपके द्वारा "लिंक" करने के लिए इच्छित प्रत्येक बाइनरी के लिए ऐसा करने का नकारात्मक पक्ष है, लेकिन यह आपको अपने $PATHपर्यावरण चर को कम करने की आवश्यकता के बिना कमांड लाइन से उन बायनेरिज़ को कॉल करने की अनुमति देता है ।

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