scl CentOS 6.4を永続的に有効にする方法


33

新しいバージョンのdevtoolset(1.1)をインストールしましたが、これらを永続的にデフォルトに設定する方法を知りたいと思いました。今、CentOSを実行しているサーバーにsshするとき、このコマンドを実行する必要がありますscl enable devtoolset-1.1 bash

〜/ .bashrcに追加して、最後の行に貼り付けようとしましたが、成功しませんでした。

回答:


62

~/.bashrcまたは~/.bash_profile、devtoolsetで提供される「enable」スクリプトを単にソースします。たとえば、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で機能しています
datdinhquoc

1
@datdinhquocはい、ソースを取得する必要があります/opt/rh/devtoolset-7/enable
デストロイ

13

の代替 source /opt/rh/devtoolset-4/enable

source scl_source enable devtoolset-4

上記のシェルスクリプト 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シェルが作成されることです。.bashrcに配置すると、新しいシェルが作成されます。これは.bashrcをロードし、実行します。scl enable devtoolset-1.1 bash、新しいシェルを作成し、.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が含まれていない場合、最初のものはforkbombを継続します。また、ネイティブ環境にgcc 4.7.2がある場合は動作しません。
  • 上記のように、これにより新しいシェルが作成されます。したがって、ターミナルウィンドウまたはsshセッションを作成すると、2つのbashセッションになり、exit2回行う必要があります。

お返事ありがとうございます。私は確かにフォーク爆弾を手に入れたが、理由を理解しなかったが、それは完全に理にかなっている。scl enable devtoolset-1.1 bashを使用することは、古いバージョンではなく4.7.2のみを使用するため、実用的な方法ではないようです。古いバージョンのdevtoolsを削除し、1つのバージョンのみにするために他のことをする必要がありますか?
th3v0id 14

マシンにroot権限があり、古いバージョンのgcc(またはdevtoolset-1.1の他のツール)を必要としない場合は、はい、最新のgccをネイティブにインストールすることができます。devtoolsetを削除する必要はありませんscl enable。削除しないでください。
rob05c

わかった。ええ、ルート権限があります。どのようにしてネイティブに「インストール」しますか?両方ともインストールされていscl enableますが、新しいsshセッションを開くたびに実行する必要があります。これらのnoobish質問をおaびしますが、新しいバージョンをデフォルトとして設定する方法がわかりません。bashプロファイルにエクスポートする必要がある環境変数はありますか?
th3v0id

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 14

yumにgcc4.7がまだインストールされていない古いバージョンのCentOSを使用していると思われます。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に入れます。これにより、devtoolset gcc4.7 を入力gccまたはg++取得できます。
rob05c 14

0

他の回答に記載されているスクリプトを見つける別の方法は、パッケージマネージャーにその場所を知らせることです。

これは、RHEL / CentOS vagrantマシンでdotnetツールを取り込むために実行するものです。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.