Как постоянно включить scl CentOS 6.4?

33

Я установил более новую версию devtoolset (1.1), и мне было интересно, как я могу навсегда установить их по умолчанию. Прямо сейчас, когда я захожу на свой сервер с ОС CentOS, мне нужно запустить эту командуscl enable devtoolset-1.1 bash

Я попытался добавить его в ~ / .bashrc и просто вставить в последнюю строку, но безуспешно.

th3v0id
источник

Ответы:

62

В вашем исходном ~/.bashrcили ~/.bash_profileпростом источнике скрипт «enable», поставляемый с devtoolset. Например, в Devtoolset 2 команда выглядит так:

source /opt/rh/devtoolset-2/enable

или

source scl_source enable devtoolset-2

Гораздо эффективнее: нет ни одной бомбы, ни хитрой оболочки

Destroyica
источник
Это было применимо к 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Установлен на моем 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
olibre
источник
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
  • первый будет продолжать выполнять forkbomb, если devtoolset-1.1 не содержит gcc 4.7.2, и также не будет работать, если в вашей собственной среде есть gcc 4.7.2.
  • это создает новую оболочку, как указано выше. Поэтому, когда вы создаете окно терминала или сеанс ssh, вы будете в двух сеансах bash, и вам придется exitдважды.
rob05c
источник
Спасибо что нашли время ответить. Я действительно получил вилочную бомбу и не понимал почему, но это имеет смысл. Похоже, использование scl enable devtoolset-1.1 bash не является практическим способом, так как я собираюсь использовать только 4.7.2, а не более старую версию. Нужно ли мне просто удалять старую версию devtools и делать некоторые другие вещи, чтобы иметь только одну версию?
th3v0id
Если у вас есть права суперпользователя на компьютере и вам никогда не нужна более старая версия gcc (или других инструментов в devtoolset-1.1), тогда да, вы можете просто установить последнюю версию gcc. Вам не нужно удалять devtoolset, просто не делайте scl enableэтого.
rob05c
Попался. Да, у меня есть права root. Как вы «устанавливаете» вещи изначально? Оба установлены, но я должен запускаться scl enableкаждый раз, когда открываю новый сеанс SSH. Я извиняюсь за эти нубистские вопросы, но я не уверен, как установить новую версию по умолчанию. Есть ли переменная окружения, которую мне нужно экспортировать в мой профиль bash?
th3v0id
Похоже, вы не понимаете, как работают scl и devtoolset. Devtoolset - это коллекция для Software Collections (SCL). SCL позволяет использовать несколько версий одного и того же инструмента. Например, если вам нужен GCC 4.4 и GCC 4.7 на одном компьютере, вы можете сделать это с помощью SCL. GCC 4.7 на самом деле не установлен в вашей системе, он находится в среде SCL. Только старая версия (4.4?) Действительно установлена. Для естественной установки приложений используйте менеджер пакетов вашего дистрибутива. В Ubuntu это apt-get, например sudo apt-get install gcc. На CentOS это ням, например sudo yum install gcc.
rob05c
Я подозреваю, что у вас есть старая версия CentOS, в которой нет gcc4.7 в yum. Я бы сделал 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. Это позволит вам набрать gccили g++получить devtoolset gcc4.7.
rob05c
0

Альтернативный способ найти сценарий, упомянутый в других ответах, - позволить вашему менеджеру пакетов сообщить вам, где он находится.

Это то, что мы используем, чтобы использовать инструменты dotnet на наших бродячих машинах RHEL / CentOS.

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

kenchilada
источник