Scl CentOS 6.4 kalıcı olarak nasıl etkinleştirilir?


33

Devtoolset'in (1.1) daha yeni bir sürümünü kurdum ve bunları kalıcı olarak nasıl varsayılan olarak ayarlayacağımı merak ediyordum. Şu anda, CentOS çalıştıran sunucuma ssh yaptığımda, bu komutu çalıştırmam gerekiyorscl enable devtoolset-1.1 bash

~ / .Bashrc dosyasına eklemeyi ve sadece son satırda başarı ile yapıştırmayı denedim.

Yanıtlar:


62

Sizin ~/.bashrcveya ~/.bash_profileBasitçe kaynağınızda, devtoolset ile birlikte verilen "enable" komut dosyası. Örneğin, Devtoolset 2 ile komut şu şekildedir:

source /opt/rh/devtoolset-2/enable

veya

source scl_source enable devtoolset-2

Çok daha verimli: çatal, bomba yok


Bu, 6.8 numaralı centos için de geçerliydi. "Kaynak / opt / rh / devtoolset-3 / enable" 'ta sadece küçük bir değişiklik
JonnyRo

1
Bu dosyanın kaynağı hala devtoolset-7 ile çalışıyor
datdinhquoc

1
@datdinhquoc evet, kaynak göstermeniz gerekiyor/opt/rh/devtoolset-7/enable
Destroyica

13

Alternatif bir source /opt/rh/devtoolset-4/enableIS

source scl_source enable devtoolset-4

Yukarıdaki kabuk betiği scl_source, kodlanmış bir yol kullanmaktan daha zarif (başka bir makinede farklı olabilir). Ancak scl_sourcedaha az yapar, çünkü /opt/rh/devtoolset-4/enablekullanımlar scl_sourceve diğer şeyler.

Kullanmak için scl_sourcepaketi yükseltmeniz gerekebilirscl-utils

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

Hızlı kopyala-yapıştır

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

Meraklı insanlar için kaynak kodu

scl_sourceKaynak kodun bir örneği :
https://gist.github.com/bkabrda/6435016

scl_sourceBenim Red Hat 7.1 yüklü

#!/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

Sorun şu ki scl enable devtoolset-1.1 bash, yeni bir bash kabuğu yaratıyor. Böylece scl enable devtoolset-1.1 bash.bashrc'nize koyduğunuzda, .bashrc'ınızı yükleyen yeni bir kabuk oluşturur. Bu, çalışan , yeni bir kabuk oluşturur .bashrc'ınızı yükleyen ... Forkbomb!

Muhtemelen .bashrc içinde böyle bir şey istersiniz:

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

veya

if [ -z "$TRIEDSCLDEVTOOLSET" ]; then
  export TRIEDSCLDEVTOOLSET=true
  scl enable devtoolset-1.1 bash
fi
  • Birincisi, devtoolset-1.1 gcc 4.7.2 içermiyorsa, ilk önce çatalla mücadeleye devam edecek ve yerel ortamınızda gcc 4.7.2 varsa, çalışmaz.
  • bu yukarıdaki gibi yeni bir kabuk oluşturur. Böylece, terminal pencerenizi veya ssh oturumunuzu oluşturduğunuzda, iki bash oturumunda olacaksınız ve iki exitkez yapmanız gerekecek .

Cevaplamak için zaman ayırdığınız için teşekkür ederiz. Gerçekten bir çatal bomba aldım ve nedenini anlamadım ama bu çok mantıklı geliyor. Scl enable devtoolset-1.1 bash komutunu kullanmak gibi bir şey değil, sadece daha eski sürümü kullanmaya başlayacağımdan, sadece 4.7.2'ye alıyorum. Sadece devtools eski sürümünü kaldırmak ve sadece bir sürüme sahip başka şeyler yapmak gerekir mi?
th3v0id

Makinede kök ayrıcalıklarınız varsa ve daha önce gcc'nin (veya devtoolset-1.1'deki diğer araçların) eski sürümüne ihtiyaç duymazsanız, evet, en son gcc'yi yerel olarak kurmak isteyebilirsiniz. Devtoolset'i kaldırmak zorunda değilsin, sadece yapma scl enable.
rob05c

Yakaladım. Evet, kök izinlerim var. Bir şeyleri yerel olarak nasıl "kurarsınız"? Her ikisi de yüklü ama scl enableyeni bir ssh oturumu açtığımda her koşmam gerekiyor. Bu noobish sorular için özür dilerim ama yeni sürümü nasıl varsayılan olarak ayarlayacağımızdan emin değilim. Bash profilimde dışa aktarmam gereken bir ortam değişkeni var mı?
th3v0id

Anlaşılan scl ve devtoolset'in nasıl çalıştığını anlamıyor gibisin. Devtoolset, Yazılım Koleksiyonları (SCL) için bir koleksiyondur. SCL, aynı aracın birden fazla versiyonunu kullanmanızı sağlar. Örneğin, aynı makinede GCC 4.4 ve GCC 4.7'ye ihtiyacınız varsa, bunu SCL ile yapabilirsiniz. GCC 4.7 sisteminizde kurulu değil, SCL ortamında. Yalnızca eski sürüm (4.4?) Gerçekten yüklü. Uygulamaları yerel olarak yüklemek için distro'nun paket yöneticisini kullanın. Ubuntu'da, bu apt-get, örn sudo apt-get install gcc. CentOS'ta, bu yum, örn sudo yum install gcc.
rob05c

CentOS’un henüz bir gcc4.7 sürümü olmayan eski bir sürümünün olduğundan şüpheleniyorum. Yapar sudo yum update && sudo yum install gccve kontrol ederdim gcc --version. 4.7 değilse, muhtemelen devtoolset kullanmak zorundasınız. sudo yum remove gccSCL'de çalıştırmak istemiyorsanız, yerel gcc'yi kaldırabilir ve ardından devtoolset dizinini yolunuza ekleyebilir, yani export PATH=$PATH:/opt/centos/devtoolset-1.1/root/usr/bin.bashrc dosyasını kullanabilirsiniz. Bu , devtoolset gcc4.7 yazmanıza gccveya almanıza izin g++verecektir.
rob05c

0

Diğer cevaplarda belirtilen betiği bulmanın alternatif bir yolu da paket yöneticinize nerede yaşadığını söylemektir.

RHEL / CentOS serseri makinelerimizdeki dotnet araçlarını çekmek için çalıştırdığımız şey budur.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.