如何永久启用scl CentOS 6.4?


33

我安装了较新版本的devtoolset(1.1),并且想知道如何将它们永久设置为默认值。现在,当我进入运行CentOS的服务器时,我必须运行此命令scl enable devtoolset-1.1 bash

我尝试将其添加到〜/ .bashrc并将其仅粘贴到最后一行,但没有成功。

Answers:


62

在您~/.bashrc~/.bash_profileSimply源中,devtoolset随附的“启用”脚本。例如,对于Devtoolset 2,命令为:

source /opt/rh/devtoolset-2/enable

要么

source scl_source enable devtoolset-2

效率更高:没有前炸弹,没有棘手的外壳


这适用于centos 6.8。只是对“ source / opt / rh / devtoolset-3 / enable”进行了微小更改
JonnyRo

1
采购此文件仍在使用devtoolset-7
daddinhquoc 18'Aug

1
@datdinhquoc是的,您需要来源/opt/rh/devtoolset-7/enable
Destroyica

13

的替代方案source /opt/rh/devtoolset-4/enable

source scl_source enable devtoolset-4

上面的Shell脚本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在我的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

3

问题是scl enable devtoolset-1.1 bash创建了一个新的bash shell。因此,当您将其放入.bashrc中时,它会创建一个新的shell ...它将加载您的.bashrc,该scl enable devtoolset-1.1 bashshell 将运行,这将创建一个新的shell,该外壳将加载您的.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
  • 如果devtoolset-1.1不包含gcc 4.7.2,则第一个命令将继续进行格式化;如果您的本机环境具有gcc 4.7.2,则第一个命令也将无法工作。
  • 如上所述,这将创建一个新的外壳。因此,当您创建终端窗口或ssh会话时,您将处于两个bash会话中,并且必须exit两次。

感谢您抽出时间回复。我确实有一把叉子炸弹,不知道为什么,但这很合情合理。听起来使用scl enable devtoolset-1.1 bash并不是可行的方法,因为我只打算使用4.7.2而不是旧版本。我是否只需要删除较旧版本的devtools并做一些其他事情以仅拥有一个版本?
th3v0id 2014年

如果您在计算机上具有root特权,并且永远不需要较旧版本的gcc(或devtoolset-1.1中的其他工具),则可以,您可能只想本地安装最新的gcc。您不必删除devtoolset,也不必删除scl enable它。
rob05c 2014年

知道了 是的,我有root权限。您如何在本地“安装”东西?两者都已安装,但scl enable每次打开新的ssh会话时我都必须运行。对于这些令人讨厌的问题,我深表歉意,但是我不确定如何将较新版本设置为默认版本。我的bash配置文件中是否需要导出一个环境变量?
th3v0id 2014年

听起来您似乎不了解scl和devtoolset的工作方式。Devtoolset是软件集合(SCL)的集合。SCL使您可以使用同一工具的多个版本。例如,如果您在同一台计算机上需要GCC 4.4和GCC 4.7,则可以使用SCL来完成。GCC 4.7尚未真正安装在您的系统上,而是在SCL环境中。实际上只安装了较旧的版本(4.4?)。要本地安装应用程序,请使用发行版的软件包管理器。在Ubuntu上,这是apt-get,例如sudo apt-get install gcc。在CentOS上,这是yum,例如sudo yum install gcc
rob05c 2014年

我怀疑您有一个旧版本的CentOS,但还没有gcc4.7。我会sudo yum update && sudo yum install gcc检查一下gcc --version。如果不是4.7,则可能必须使用devtoolset。如果您不想在SCL中运行它,则可以使用卸载本机gcc,sudo yum remove gcc然后将devtoolset目录添加到路径中,即放入export PATH=$PATH:/opt/centos/devtoolset-1.1/root/usr/bin.bashrc中。这将使您键入gccg++并获得devtoolset gcc4.7。
rob05c 2014年

0

查找其他答案中提到的脚本的另一种方法是让程序包管理器告诉您脚本的位置。

这就是我们在RHEL / CentOS流浪者机器上引入dotnet工具的目的。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.