कैसे scl CentOS 6.4 को स्थायी रूप से सक्षम करने के लिए?


33

मैंने devtoolset (1.1) का एक नया संस्करण स्थापित किया और सोच रहा था कि मैं डिफ़ॉल्ट रूप से स्थापित करने के लिए स्थायी रूप से कैसे स्थापित करूंगा। अभी, जब मैं CentOS चलाने वाले अपने सर्वर में ssh करता हूं, तो मुझे यह कमांड चलाना होगाscl enable devtoolset-1.1 bash

मैंने इसे ~ / .bashrc में जोड़ने की कोशिश की और बस इसे सफलता के बिना, बहुत ही अंतिम पंक्ति पर चिपका दिया।

जवाबों:


62

अपने ~/.bashrcया ~/.bash_profileसरल स्रोत में "सक्षम करें" स्क्रिप्ट भक्तगण के साथ प्रदान की जाती है। उदाहरण के लिए, Devtoolset 2 के साथ, कमांड है:

source /opt/rh/devtoolset-2/enable

या

source scl_source enable devtoolset-2

बहुत अधिक कुशल: कोई forkbomb, कोई मुश्किल खोल नहीं


यह सेंटोस 6.8 पर लागू था। "स्रोत / ऑप्ट / आरएच / डेवलेसेट -3 / सक्षम" के लिए बस एक छोटा सा बदलाव
जोनीरो

1
इस फ़ाइल को सोर्स करना अभी भी devtoolset-7
datdinhquoc

1
@datdinhquoc हाँ, आपको स्रोत की आवश्यकता है/opt/rh/devtoolset-7/enable
नष्ट करना

13

का एक विकल्प source /opt/rh/devtoolset-4/enableहै

source scl_source enable devtoolset-4

उपरोक्त शेल स्क्रिप्ट scl_sourceएक हार्ड कोडित पथ का उपयोग करने से अधिक सुरुचिपूर्ण है (किसी अन्य मशीन पर भिन्न हो सकती है)। हालांकि scl_sourceकम /opt/rh/devtoolset-4/enableउपयोग करता है scl_sourceऔर अन्य सामान।

उपयोग करने के लिए scl_sourceआपको पैकेज को अपग्रेड करना पड़ सकता हैscl-utils

yum update scl-utils  # old scl-utils versions miss scl_source

क्विक कॉपी-पेस्ट

echo 'source scl_source enable devtoolset-4' >> ~/.bashrc
    # Do not forget to change the version ↑

जिज्ञासु लोगों के लिए स्रोत कोड

scl_sourceस्रोत कोड का एक उदाहरण :
https://gist.github.com/bkabrda/6435016

scl_sourceमेरी रेड हैट 7.1 पर स्थापित

#!/bin/bash

_scl_source_help="Usage: source scl_source <action> [<collection> ...]

Don't use this script outside of SCL scriptlets!

Options:
    -h, --help    display this help and exit"

if [ $# -eq 0 -o $1 = "-h" -o $1 = "--help" ]; then
    echo "$_scl_source_help"
    return 0
fi


if [ -z "$_recursion" ]; then
    _recursion="false"
fi
if [ -z "$_scl_scriptlet_name" ]; then
    # The only allowed action in the case of recursion is the same
    # as was the original
    _scl_scriptlet_name=$1
fi
shift 1

if [ -z "$_scl_dir" ]; then
    # No need to re-define the directory twice
    _scl_dir=/etc/scl/conf
    if [ ! -e $_scl_dir ]; then
        _scl_dir=/etc/scl/prefixes
    fi
fi

for arg in "$@"; do
    _scl_prefix_file=$_scl_dir/$arg
    _scl_prefix=`cat $_scl_prefix_file 2> /dev/null`
    if [ $? -ne 0 ]; then
        echo "Can't read $_scl_prefix_file, $arg is probably not installed."
        return 1
    fi

    # First check if the collection is already in the list
    # of collections to be enabled
    for scl in ${_scls[@]}; do
        if [ $arg == $scl ]; then
            continue 2
        fi
    done

    # Now check if the collection isn't already enabled
    /usr/bin/scl_enabled $arg > /dev/null 2> /dev/null
    if [ $? -ne 0 ]; then
        _scls+=($arg)
        _scl_prefixes+=($_scl_prefix)
    fi;
done

if [ $_recursion == "false" ]; then
    _i=0
    _recursion="true"
    while [ $_i -lt ${#_scls[@]} ]; do
        _scl_scriptlet_path="${_scl_prefixes[$_i]}/${_scls[$_i]}/${_scl_scriptlet_name}"
        source "$_scl_scriptlet_path"
        if [ $? -ne 0 ]; then
            echo "Can't source $_scl_scriptlet_name, skipping."
        else
            export X_SCLS="${_scls[$_i]} $X_SCLS"
        fi;
        _i=$(($_i+1))
    done
    _scls=()
    _scl_prefixes=()
    _scl_scriptlet_name=""
    _recursion="false"
fi

3

समस्या यह है कि scl enable devtoolset-1.1 bashएक नया बैश शेल बनाता है। इसलिए जब आप इसे अपने .bashrc में रखते हैं, तो यह एक नया शेल बनाता है ... जो आपके .bashrc को लोड करता है, जो चलता है scl enable devtoolset-1.1 bash, जो एक नया शेल बनाता है, जो आपके .bashrc ... Forkbomb को लोड करता है!

आप शायद अपने .bashrc में ऐसा कुछ चाहते हैं:

if [ "$(gcc -dumpversion)" != "4.7.2" ]; then 
  scl enable devtoolset-1.1 bash
fi

या

if [ -z "$TRIEDSCLDEVTOOLSET" ]; then
  export TRIEDSCLDEVTOOLSET=true
  scl enable devtoolset-1.1 bash
fi
  • पहले forkbomb जारी रहेगा यदि devtoolset-1.1 में gcc 4.7.2 नहीं है, और यह भी काम करने में विफल रहेगा यदि आपके मूल वातावरण में 4.7.2 है।
  • यह ऊपर की तरह एक नया शेल बनाता है। इसलिए जब आप अपनी टर्मिनल विंडो या ssh सत्र बनाते हैं, तो आप दो बैश सत्रों में होंगे, और exitदो बार करना होगा।

जवाब देने का समय निकालने के लिए धन्यवाद। मुझे वास्तव में एक कांटा बम मिला और समझ में नहीं आया कि क्यों लेकिन यह सही समझ में आता है। ऐसा लगता है कि scl enable devtoolset-1.1 bash का उपयोग करने का व्यावहारिक तरीका नहीं है तब से मैं केवल 4.7.2 का उपयोग करने जा रहा हूं और पुराने संस्करण का नहीं। क्या मुझे केवल पुराने संस्करणों को हटाने और कुछ अन्य चीजों को केवल एक संस्करण के लिए करने की आवश्यकता होगी?
th3v0id

यदि आपके पास मशीन पर रूट विशेषाधिकार हैं और आपको कभी भी जीसीसी के पुराने संस्करण की आवश्यकता नहीं है (या अन्य उपकरणों में डेवलेसेटसेट -१.१) तो हां, आप केवल नवीनतम जीसीसी को मूल रूप से स्थापित करना चाह सकते हैं। तुम भटकना दूर करने के लिए नहीं है, बस यह नहीं scl enableहै।
रोब05 सी

पकड़ लिया। हाँ, मुझे रूट अनुमतियां मिल गई हैं। आप मूल रूप से चीजों को "इंस्टॉल" कैसे करते हैं? दोनों स्थापित हैं लेकिन मुझे scl enableहर बार एक नया ssh सत्र खोलना होगा। मैं इन नीच सवालों के लिए माफी माँगता हूँ, लेकिन मुझे यकीन नहीं है कि नए संस्करण को डिफ़ॉल्ट के रूप में कैसे स्थापित किया जाए। क्या एक पर्यावरण चर है जिसे मुझे अपने बैश प्रोफ़ाइल में निर्यात करने की आवश्यकता है?
th3v0id

ऐसा लगता है कि आप समझ नहीं पा रहे हैं कि scl और devtoolset कैसे काम करते हैं। Devtoolset सॉफ्टवेयर कलेक्शंस (SCL) के लिए एक संग्रह है। SCL आपको एक ही टूल के कई संस्करणों का उपयोग करने देता है। उदाहरण के लिए, यदि आपको एक ही मशीन पर GCC 4.4 और GCC 4.7 की आवश्यकता है, तो आप इसे SCL के साथ कर सकते हैं। GCC 4.7 वास्तव में आपके सिस्टम पर स्थापित नहीं है, यह SCL वातावरण में है। केवल पुराना संस्करण (4.4?) वास्तव में स्थापित है। ऐप्स को मूल रूप से इंस्टॉल करने के लिए, अपने डिस्ट्रो के पैकेज मैनेजर का उपयोग करें। उबंटू पर, यह उपयुक्त है, जैसे sudo apt-get install gcc। CentOS पर, यह yum है, उदा sudo yum install gcc
लुटे ०५ सी

मुझे संदेह है कि आपके पास सेंटोस का एक पुराना संस्करण है जो अभी तक yum में gcc4.7 नहीं है। मैं करूंगा sudo yum update && sudo yum install gccऔर जांच करूंगा gcc --version। यदि यह 4.7 नहीं है, तो आपको शायद डिवॉल्टसेट का उपयोग करना होगा। यदि आप इसे SCL में नहीं चलाना चाहते हैं, तो आप देशी gcc की स्थापना रद्द कर सकते हैं sudo yum remove gccऔर फिर अपने पथ पर devtoolset डायरेक्टरी जोड़ सकते हैं, अर्थात export PATH=$PATH:/opt/centos/devtoolset-1.1/root/usr/binअपने .bashrc में डाल सकते हैं। यह आपको टाइप करने देगा gccया g++डिवर्टसेट gcc4.7 मिलेगा।
रोब ०५ सी

0

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

यह वह है जो हम अपने आरएचईएल / सेंटोस योनि मशीनों पर डॉटनेट टूल में खींचने के लिए चलाते हैं।

source $(rpm -ql rh-dotnet20-runtime|grep -E /enable$)

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