SCL 저장소에서 설치된 소프트웨어의 최신 버전을 영구적으로 활성화하려면 어떻게 해야 합니까?

SCL 저장소에서 설치된 소프트웨어의 최신 버전을 영구적으로 활성화하려면 어떻게 해야 합니까?

CentOS 6.4:

최신 버전의 devtoolset(1.1)을 설치했는데 이를 기본값으로 영구적으로 설정하는 방법이 궁금합니다. 이제 CentOS 6을 실행하는 서버에 SSH로 접속할 때 다음 명령을 실행해야 합니다.scl enable devtoolset-1.1 bash

~/.bashrc에 추가하고 마지막 줄에 붙여넣으려고 했지만 성공하지 못했습니다.

답변1

~/.bashrc또는 ~/.bash_profile개발 도구 세트에서 제공하는 "활성화" 스크립트를 얻으세요 . 예를 들어 Devtoolset 2를 사용하는 경우 명령은 다음과 같습니다.

source /opt/rh/devtoolset-2/enable

또는

source scl_source enable devtoolset-2

더욱 효율적: 포크 폭탄이나 까다로운 케이스 없음

답변2

대안 source /opt/rh/devtoolset-4/enable

source scl_source enable devtoolset-4

위의 쉘 스크립트는 scl_source하드코딩된 경로(다른 시스템에서는 다를 수 있음)를 사용하는 것보다 더 우아합니다. 그러나 사용량 및 기타 사항으로 인해 scl_source수행되는 작업은 적습니다 ./opt/rh/devtoolset-4/enablescl_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_sourceRed 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가 포함되어 있지 않으면 계속해서 폭탄을 터뜨리고 기본 환경에 gcc 4.7.2가 있으면 작동하지 않습니다.
  • 위에서 설명한 대로 새 쉘이 생성됩니다. 따라서 터미널 창이나 SSH 세션을 생성하면 두 개의 bash 세션에 있게 되며 이를 exit두 번 수행해야 합니다.

답변4

모든 사용자를 위해 시스템 전체에서 활성화합니다. /etc/profile" "에서 다음을 수정 하십시오 .

source scl_source enable devtoolset-2

관련 정보