scl CentOS 6.4를 영구적으로 활성화하는 방법은 무엇입니까?


33

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

~ / .bashrc에 추가하고 성공하지 않고 마지막 줄에 붙여 넣기를 시도했습니다.

답변:


62

귀하 ~/.bashrc또는 ~/.bash_profile간단히 소스 도구에서 devtoolset과 함께 제공되는 "활성화"스크립트를 제공하십시오. 예를 들어, Devtoolset 2에서 명령은 다음과 같습니다.

source /opt/rh/devtoolset-2/enable

또는

source scl_source enable devtoolset-2

훨씬 더 효율적 : for 폭탄, 까다로운 껍질 없음


이것은 centos 6.8에 적용되었습니다. "source / opt / rh / devtoolset-3 / enable"에 대한 약간의 변경
JonnyRo

1
이 파일을 소싱하는 것은 여전히 ​​devtoolset-7과 함께 작동합니다
datdinhquoc

1
@datdinhquoc 그렇습니다, 당신은 소스를 필요로합니다/opt/rh/devtoolset-7/enable
Destroyica

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내 레드햇 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에 넣으면 새로운 셸 scl enable devtoolset-1.1 bash이 생성됩니다. .bashrc 가로 드되고 .bashrc 가로 드됩니다. .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

머신에 대한 루트 권한이 있고 이전 버전의 gcc (또는 devtoolset-1.1의 다른 도구)가 필요하지 않은 경우에는 최신 gcc를 기본적으로 설치하면됩니다. devtoolset을 제거 할 필요는 없습니다 scl enable.
rob05c

알았어 예, 루트 권한이 있습니다. 기본적으로 어떻게 "설치"합니까? 둘 다 설치되었지만 scl enable새 ssh 세션을 열 때마다 실행해야합니다 . 이 멍청한 질문에 대해 사과 드리지만 최신 버전을 기본값으로 설정하는 방법을 잘 모르겠습니다. 내 bash 프로파일에서 내 보내야 할 환경 변수가 있습니까?
th3v0id

scl과 devtoolset이 어떻게 작동하는지 이해하지 못하는 것 같습니다. Devtoolset은 SCL (Software Collections) 모음입니다. SCL을 사용하면 동일한 도구의 여러 버전을 사용할 수 있습니다. 예를 들어, 동일한 시스템에 GCC 4.4 및 GCC 4.7이 필요한 경우 SCL을 사용하여 수행 할 수 있습니다. GCC 4.7은 실제로 시스템에 설치되어 있지 않으며 SCL 환경에 있습니다. 이전 버전 (4.4?) 만 실제로 설치됩니다. 기본적으로 앱을 설치하려면 배포판의 패키지 관리자를 사용하십시오. 우분투에서 이것은 apt-get sudo apt-get install gcc입니다. CentOS에서 이것은 yum입니다 (예 :) sudo yum install gcc.
rob05c

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

0

다른 답변에서 언급 한 스크립트를 찾는 다른 방법은 패키지 관리자가 어디에 있는지 알려주는 것입니다.

이것이 우리가 RHEL / CentOS vagrant machine에서 dotnet 도구를 사용하기 위해 실행하는 것입니다.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.