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.
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
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
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
exit
deux fois.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$)