Como habilitar permanentemente o Scl CentOS 6.4?

28

Eu instalei uma versão mais nova do devtoolset (1.1) e fiquei imaginando como eu poderia defini-las permanentemente como padrão. Agora, quando eu ssh no meu servidor executando o CentOS, eu tenho que executar este comando scl enable devtoolset-1.1 bash

Eu tentei adicioná-lo ao ~ / .bashrc e simplesmente colá-lo na última linha, sem sucesso.

    
por th3v0id 25.12.2014 / 08:52

4 respostas

54

No seu ~/.bashrc ou ~/.bash_profile Simplesmente forneça o script "enable" fornecido com o devtoolset. Por exemplo, com o Devtoolset 2, o comando é:

source /opt/rh/devtoolset-2/enable

ou

source scl_source enable devtoolset-2

Muito mais eficiente: sem forkbomb, sem shell complicado

    
por 09.04.2015 / 10:30
11

Uma alternativa de source /opt/rh/devtoolset-4/enable é

source scl_source enable devtoolset-4

O script de shell acima scl_source é mais elegante do que usar um caminho codificado (pode ser diferente em outra máquina). No entanto, scl_source faz menos porque /opt/rh/devtoolset-4/enable usa scl_source e outras coisas.

Para usar scl_source , talvez seja necessário fazer o upgrade do pacote scl-utils

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

Copiar e colar rapidamente

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

Código-fonte para pessoas curiosas

Um exemplo de scl_source do código fonte: link

O scl_source instalado no meu Red Hat 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
    
por 02.12.2015 / 14:10
2

O problema é que scl enable devtoolset-1.1 bash cria um novo shell bash. Então, quando você coloca no seu .bashrc, ele cria um novo shell ... que carrega o seu .bashrc, que executa o scl enable devtoolset-1.1 bash , que cria um novo shell, que carrega o seu .bashrc ... Forkbomb!

Você provavelmente quer algo assim em seu .bashrc:

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

ou

if [ -z "$TRIEDSCLDEVTOOLSET" ]; then
  export TRIEDSCLDEVTOOLSET=true
  scl enable devtoolset-1.1 bash
fi
  • o primeiro continuará a forkbomb se o devtoolset-1.1 não contiver gcc 4.7.2 e também falhará se o seu ambiente nativo tiver o gcc 4.7.2.
  • isso cria um novo shell, como acima. Então, quando você criar sua janela de terminal ou sessão ssh, você estará em duas sessões bash e precisará exit duas vezes.
por 26.12.2014 / 19:42
0

Uma maneira alternativa de localizar o script mencionado em outras respostas é permitir que o gerente do pacote informe onde ele está.

Isso é o que corremos para usar as ferramentas dotnet em nossas máquinas vagabundas RHEL / CentOS.

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

    
por 10.11.2017 / 17:08