Bagaimana cara mengaktifkan scl CentOS 6.4 secara permanen?

33

Saya menginstal versi yang lebih baru dari devtoolset (1.1) dan bertanya-tanya bagaimana saya akan secara permanen menetapkan ini sebagai default. Saat ini, ketika saya ssh ke server saya menjalankan CentOS, saya harus menjalankan perintah iniscl enable devtoolset-1.1 bash

Saya mencoba menambahkannya ke ~ / .bashrc dan cukup menempelkannya di baris terakhir, tanpa hasil.

th3v0id
sumber

Jawaban:

62

Di sumber Anda ~/.bashrcatau ~/.bash_profileCukup, skrip "aktifkan" yang disediakan dengan devtoolset. Misalnya, dengan Devtoolset 2, perintahnya adalah:

source /opt/rh/devtoolset-2/enable

atau

source scl_source enable devtoolset-2

Jauh lebih efisien: tanpa forkbomb, tidak ada shell yang rumit

Destroyica
sumber
Ini berlaku pada centos 6.8. Hanya perubahan kecil ke "source / opt / rh / devtoolset-3 / enable"
JonnyRo
1
sumber file ini masih bekerja dengan devtoolset-7
datdinhquoc
1
@datdinhquoc ya, Anda perlu sumber/opt/rh/devtoolset-7/enable
Destroyica
13

Alternatif source /opt/rh/devtoolset-4/enableadalah

source scl_source enable devtoolset-4

Script shell di atas scl_sourcelebih elegan daripada menggunakan jalur kode keras (mungkin berbeda pada komputer lain). Namun scl_sourcetidak sedikit karena /opt/rh/devtoolset-4/enablekegunaan scl_sourcedan hal-hal lain.

Untuk menggunakan scl_sourceAnda mungkin harus meningkatkan paketscl-utils

yum update scl-utils  # old scl-utils versions miss scl_source

Salin-tempel cepat

echo 'source scl_source enable devtoolset-4' >> ~/.bashrc
    # Do not forget to change the version ↑

Kode sumber untuk orang yang ingin tahu

Contoh scl_sourcekode sumber:
https://gist.github.com/bkabrda/6435016

The scl_sourcediinstal pada saya 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
sumber
3

Masalahnya adalah yang scl enable devtoolset-1.1 bashmembuat bash shell baru. Jadi ketika Anda memasukkannya ke dalam .bashrc Anda, itu akan membuat sebuah shell baru ... yang memuat .bashrc Anda, yang berjalan scl enable devtoolset-1.1 bash, yang menciptakan sebuah shell baru, yang memuat .bashrc Anda ... Forkbomb!

Anda mungkin menginginkan sesuatu seperti ini di .bashrc Anda:

if [ "$(gcc -dumpversion)" != "4.7.2" ]; then 
  scl enable devtoolset-1.1 bash
fi

atau

if [ -z "$TRIEDSCLDEVTOOLSET" ]; then
  export TRIEDSCLDEVTOOLSET=true
  scl enable devtoolset-1.1 bash
fi
  • yang pertama akan terus forkbomb jika devtoolset-1.1 tidak mengandung gcc 4.7.2, dan juga akan gagal berfungsi jika lingkungan asli Anda memiliki gcc 4.7.2.
  • ini membuat shell baru, seperti di atas. Jadi, ketika Anda membuat jendela terminal atau sesi ssh, Anda akan berada dalam dua sesi bash, dan harus exitdua kali.
rob05c
sumber
Terima kasih telah meluangkan waktu untuk menjawab. Saya memang punya bom fork dan tidak mengerti mengapa tetapi itu masuk akal. Kedengarannya seperti menggunakan scl memungkinkan devtoolset-1.1 bash bukan cara praktis untuk pergi karena saya hanya akan menggunakan 4.7.2 dan bukan versi yang lebih lama. Apakah saya hanya perlu menghapus versi devtool yang lebih lama dan melakukan beberapa hal lain untuk hanya memiliki satu versi?
th3v0id
Jika Anda memiliki hak akses root pada mesin dan tidak pernah membutuhkan versi gcc yang lebih lama (atau alat lain di devtoolset-1.1) maka ya, Anda mungkin ingin menginstal saja gcc terbaru secara asli. Anda tidak harus menghapus devtoolset, jangan lakukan scl enableitu.
rob05c
Gotcha. Ya saya punya izin root. Bagaimana Anda "menginstal" sesuatu secara asli? Keduanya diinstal tetapi saya harus menjalankan scl enablesetiap kali saya membuka sesi ssh baru. Saya minta maaf untuk pertanyaan noobish ini tetapi saya tidak yakin bagaimana cara mengatur versi yang lebih baru sebagai default. Apakah ada variabel lingkungan yang perlu saya ekspor di profil bash saya?
th3v0id
Sepertinya Anda tidak mengerti bagaimana scl dan devtoolset bekerja. Devtoolset adalah koleksi untuk Koleksi Perangkat Lunak (SCL). SCL memungkinkan Anda menggunakan banyak versi dari alat yang sama. Misalnya, jika Anda membutuhkan GCC 4.4 dan GCC 4.7 pada mesin yang sama, Anda dapat melakukannya dengan SCL. GCC 4.7 tidak benar-benar diinstal pada sistem Anda, itu di lingkungan SCL. Hanya versi yang lebih lama (4.4?) Yang benar-benar diinstal. Untuk menginstal aplikasi secara native, gunakan manajer paket distro Anda. Di Ubuntu, ini tepat, misalnya sudo apt-get install gcc. Pada CentOS, ini yum, mis sudo yum install gcc.
rob05c
Saya menduga Anda memiliki versi CentOS lama yang belum memiliki gcc4.7 di yum. Saya akan melakukan sudo yum update && sudo yum install gccdan memeriksa gcc --version. Jika bukan 4.7, maka Anda mungkin harus menggunakan devtoolset. Jika Anda tidak ingin menjalankannya di SCL, Anda dapat menghapus instalan gcc asli dengan sudo yum remove gccdan kemudian menambahkan direktori devtoolset ke jalur Anda, yaitu memasukkan export PATH=$PATH:/opt/centos/devtoolset-1.1/root/usr/bin.bashrc Anda. Itu akan membiarkan Anda mengetik gccatau g++dan mendapatkan devtoolset gcc4.7.
rob05c
0

Cara alternatif untuk menemukan skrip yang disebutkan dalam jawaban lain adalah membiarkan pengelola paket Anda memberi tahu Anda di mana skrip itu berada.

Inilah yang kami jalankan untuk menarik alat dotnet pada mesin gelandangan RHEL / CentOS kami.

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

kenchilada
sumber