web-dev-qa-db-fra.com

Comment activer définitivement scl CentOS 6.4?

J'ai installé une version plus récente de devtoolset (1.1) et je me demandais comment j'allais définir définitivement ces paramètres par défaut. À l'heure actuelle, lorsque je ssh sur mon serveur exécutant CentOS, je dois exécuter cette commande scl enable devtoolset-1.1 bash

J'ai essayé de l'ajouter à ~/.bashrc et de le coller simplement sur la toute dernière ligne, sans succès.

38
th3v0id

Dans ton ~/.bashrc ou ~/.bash_profile Procurez-vous simplement le script "enable" fourni avec le devtoolset. Par exemple, avec le Devtoolset 2, la commande est:

source /opt/rh/devtoolset-2/enable

ou

source scl_source enable devtoolset-2

Beaucoup plus efficace: pas de fourche, pas de Shell délicat

69
Destroyica

Une alternative de source /opt/rh/devtoolset-4/enable est

source scl_source enable devtoolset-4

Le script Shell ci-dessus scl_source est plus élégant que l'utilisation d'un chemin codé en dur (peut être différent sur une autre machine). Cependant scl_source fait moins parce que /opt/rh/devtoolset-4/enable les usages scl_source et d'autres trucs.

Utiliser scl_source vous devrez peut-être mettre à niveau le package scl-utils

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

Copier-coller rapide

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

Code source pour les curieux

Un exemple de scl_source code source:
https://Gist.github.com/bkabrda/6435016

Le scl_source installé sur mon 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
14
olibre

Le problème est que scl enable devtoolset-1.1 bash crée un nouveau shell bash. Ainsi, lorsque vous le placez dans votre .bashrc, il crée un nouveau shell ... qui charge votre .bashrc, qui exécute scl enable devtoolset-1.1 bash, qui crée un nouveau Shell, qui charge votre .bashrc ... Forkbomb!

Vous voulez probablement quelque chose comme ça dans votre .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
  • le premier continuera à forkbomb si devtoolset-1.1 ne contient pas gcc 4.7.2, et échouera également si votre environnement natif a gcc 4.7.2.
  • cela crée un nouveau Shell, comme ci-dessus. Ainsi, lorsque vous créez votre fenêtre de terminal ou votre session ssh, vous serez dans deux sessions bash et devrez exit deux fois.
4
rob05c

Une autre façon de localiser le script mentionné dans d'autres réponses est de laisser votre gestionnaire de packages vous dire où il se trouve.

C'est ce que nous exécutons pour intégrer les outils dotnet sur nos machines vagabondes RHEL/CentOS.

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

1
kenchilada