Làm cách nào để bật vĩnh viễn scl CentOS 6.4?


33

Tôi đã cài đặt một phiên bản mới hơn của devtoolset (1.1) và đang tự hỏi làm thế nào tôi có thể cài đặt chúng vĩnh viễn thành mặc định. Ngay bây giờ, khi tôi ssh vào máy chủ của mình chạy CentOS, tôi phải chạy lệnh nàyscl enable devtoolset-1.1 bash

Tôi đã thử thêm nó vào ~ / .bashrc và chỉ cần dán nó vào dòng cuối cùng, nhưng không thành công.

Câu trả lời:


62

Trong nguồn ~/.bashrchoặc ~/.bash_profileĐơn giản là tập lệnh "enable" được cung cấp cùng với devtoolset. Ví dụ, với Devtoolset 2, lệnh là:

source /opt/rh/devtoolset-2/enable

hoặc là

source scl_source enable devtoolset-2

Hiệu quả hơn nhiều: không có nĩa, không có vỏ khó


Điều này đã được áp dụng trên centos 6.8. Chỉ cần một thay đổi nhỏ thành "nguồn / opt / rh / devtoolset-3 / enable"
JonnyRo

1
Tìm nguồn cung cấp tệp này vẫn đang hoạt động với devtoolset-7
datdinhquoc

1
@datdinhquoc vâng, bạn cần tìm nguồn/opt/rh/devtoolset-7/enable
Phá hủy

13

Một thay thế source /opt/rh/devtoolset-4/enable

source scl_source enable devtoolset-4

Kịch bản shell ở trên scl_sourcethanh lịch hơn so với sử dụng đường dẫn được mã hóa cứng (có thể khác trên máy khác). Tuy nhiên, scl_sourcelàm ít hơn bởi vì /opt/rh/devtoolset-4/enablesử dụng scl_sourcevà những thứ khác.

Để sử dụng, scl_sourcebạn có thể phải nâng cấp góiscl-utils

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

Sao chép nhanh dán

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

Mã nguồn cho những người tò mò

Một ví dụ về scl_sourcemã nguồn:
https://gist.github.com/bkabrda/6435016

Việc scl_sourcecài đặt trên Red Hat 7.1 của tôi

#!/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

Vấn đề là ở đó scl enable devtoolset-1.1 bash tạo ra một bash shell mới. Vì vậy, khi bạn đặt nó vào .bashrc, nó sẽ tạo một shell mới ... tải .bashrc của bạn, nó chạy scl enable devtoolset-1.1 bash, tạo ra một shell mới, tải .bashrc ... Forkbomb của bạn!

Bạn có thể muốn một cái gì đó như thế này trong .bashrc của bạn:

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

hoặc là

if [ -z "$TRIEDSCLDEVTOOLSET" ]; then
  export TRIEDSCLDEVTOOLSET=true
  scl enable devtoolset-1.1 bash
fi
  • đầu tiên sẽ tiếp tục forkbomb nếu devtoolset-1.1 không chứa gcc 4.7.2 và cũng sẽ không hoạt động nếu môi trường tự nhiên của bạn có gcc 4.7.2.
  • Điều này tạo ra một vỏ mới, như trên. Vì vậy, khi bạn tạo cửa sổ đầu cuối hoặc phiên ssh, bạn sẽ ở trong hai phiên bash và phải exithai lần.

Cảm ơn đã dành thời gian để trả lời. Tôi thực sự có một quả bom ngã ba và không hiểu tại sao nhưng điều đó có ý nghĩa hoàn hảo. Nghe có vẻ như sử dụng scl cho phép devtoolset-1.1 bash không phải là cách thực tế để đi vì tôi sẽ chỉ sử dụng phiên bản 4.7.2 chứ không phải phiên bản cũ hơn. Tôi chỉ cần loại bỏ phiên bản cũ hơn của devtools và làm một số thứ khác để chỉ có một phiên bản?
th3v0id

Nếu bạn có quyền root trên máy và không bao giờ cần phiên bản gcc cũ hơn (hoặc của các công cụ khác trong devtoolset-1.1) thì có, bạn có thể chỉ muốn cài đặt gcc mới nhất. Bạn không cần phải xóa devtoolset, chỉ cần không scl enable.
rob05c

Gotcha. Vâng, tôi đã có quyền root. Làm thế nào để bạn "cài đặt" mọi thứ nguyên bản? Cả hai đều được cài đặt nhưng tôi phải chạy scl enablemỗi lần tôi mở một phiên ssh mới. Tôi xin lỗi vì những câu hỏi vớ vẩn này nhưng tôi không biết làm cách nào để cài đặt phiên bản mới hơn làm mặc định. Có một biến môi trường mà tôi cần xuất trong hồ sơ bash của tôi không?
th3v0id

Có vẻ như bạn không hiểu làm thế nào scl và devtoolset hoạt động. Devtoolset là một bộ sưu tập cho Bộ sưu tập phần mềm (SCL). SCL cho phép bạn sử dụng nhiều phiên bản của cùng một công cụ. Ví dụ: nếu bạn cần GCC 4.4 và GCC 4.7 trên cùng một máy, bạn có thể làm điều đó với SCL. GCC 4.7 không thực sự được cài đặt trên hệ thống của bạn, nó ở trong môi trường SCL. Chỉ phiên bản cũ hơn (4.4?) Thực sự được cài đặt. Để cài đặt ứng dụng nguyên bản, hãy sử dụng trình quản lý gói của distro. Trên Ubuntu, đây là apt-get, vd sudo apt-get install gcc. Trên CentOS, đây là yum, vd sudo yum install gcc.
rob05c

Tôi nghi ngờ bạn có một phiên bản CentOS cũ chưa có gcc4.7 trong năm. Tôi sẽ làm sudo yum update && sudo yum install gccvà kiểm tra gcc --version. Nếu không phải là 4.7, thì có lẽ bạn phải sử dụng devtoolset. Nếu bạn không muốn chạy nó trong SCL, bạn có thể gỡ cài đặt gcc gốc sudo yum remove gccvà sau đó thêm thư mục devtoolset vào đường dẫn của bạn, tức là đặt export PATH=$PATH:/opt/centos/devtoolset-1.1/root/usr/binvào .bashrc của bạn. Điều đó sẽ cho phép bạn gõ gcchoặc g++nhận gcc4.7 devtoolset.
rob05c

0

Một cách khác để xác định vị trí tập lệnh được đề cập trong các câu trả lời khác là để người quản lý gói của bạn cho bạn biết nơi nó sống.

Đây là những gì chúng tôi chạy để sử dụng các công cụ dotnet trên các máy mơ hồ RHEL / CentOS của chúng tôi.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.