จะเปิดใช้งาน scl CentOS 6.4 อย่างถาวรได้อย่างไร


33

ฉันติดตั้ง devtoolset เวอร์ชั่นใหม่กว่า (1.1) และสงสัยว่าฉันจะตั้งค่าเหล่านี้เป็นค่าเริ่มต้นถาวรได้อย่างไร ตอนนี้เมื่อฉันเข้าสู่เซิร์ฟเวอร์ที่รัน CentOS ฉันต้องรันคำสั่งนี้scl enable devtoolset-1.1 bash

ฉันพยายามเพิ่มลงใน ~ / .bashrc และวางลงบนบรรทัดสุดท้ายโดยไม่ประสบความสำเร็จ

คำตอบ:


62

ใน~/.bashrcหรือที่~/.bash_profileมาเพียงแค่สคริปต์ "เปิดใช้งาน" ที่มาพร้อมกับชุดเครื่องมือ ตัวอย่างเช่นกับ Devtoolset 2 คำสั่งคือ:

source /opt/rh/devtoolset-2/enable

หรือ

source scl_source enable devtoolset-2

มีประสิทธิภาพมากขึ้นมาก: ไม่มี forkbomb, ไม่มีกระสุนที่ยาก


สิ่งนี้ใช้ได้กับ centos 6.8 เพียงแค่มีการเปลี่ยนแปลงเล็ก ๆ น้อย ๆ "แหล่งข่าว / opt / RH / devtoolset-3 / เปิด"
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

3

ปัญหาคือการscl enable devtoolset-1.1 bashสร้าง bash shell ใหม่ ดังนั้นเมื่อคุณใส่ไว้ใน. 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 คุณจะอยู่ในช่วงทุบตีสองครั้งและจะต้องexitสองครั้ง

ขอบคุณที่สละเวลาตอบ แน่นอนฉันได้ระเบิดด้วยส้อมและไม่เข้าใจว่าทำไม แต่นั่นก็สมเหตุสมผลดี ดูเหมือนว่าการใช้ scl เปิดใช้งาน devtoolset-1.1 bash ไม่ใช่วิธีที่ใช้งานได้จริงเนื่องจากฉันจะใช้เพียง 4.7.2 ไม่ใช่รุ่นที่เก่ากว่า ฉันจะต้องลบ devtools เวอร์ชันเก่าออกและทำสิ่งอื่นเพื่อให้มีเพียงเวอร์ชันเดียวเท่านั้นหรือไม่
th3v0id

หากคุณมีสิทธิ์ใช้งานรูทบนเครื่องและไม่จำเป็นต้องใช้ gcc รุ่นเก่ากว่า (หรือเครื่องมืออื่น ๆ ใน devtoolset-1.1) ใช่คุณอาจต้องการติดตั้ง gcc ล่าสุด คุณไม่ต้องลบ devtoolset เพียงแค่ทำscl enableมัน
rob05c

Gotcha ใช่ฉันได้รับอนุญาตให้รูท คุณ "ติดตั้ง" สิ่งต่าง ๆ ได้อย่างไร ทั้งสองถูกติดตั้ง แต่ฉันต้องทำงานscl enableทุกครั้งที่ฉันเปิดเซสชัน ssh ใหม่ ฉันขอโทษสำหรับคำถาม noobish เหล่านี้ แต่ฉันไม่แน่ใจว่าจะดำเนินการอย่างไรเกี่ยวกับการตั้งค่าเวอร์ชันที่ใหม่กว่าเป็นค่าเริ่มต้น มีตัวแปรสภาพแวดล้อมที่ฉันต้องการส่งออกในโปรไฟล์ทุบตีของฉันหรือไม่
th3v0id

ดูเหมือนคุณจะไม่เข้าใจว่า scl และ devtoolset ทำงานอย่างไร Devtoolset เป็นคอลเล็กชันสำหรับ Software Collections (SCL) SCL ช่วยให้คุณใช้เครื่องมือเดียวกันหลายรุ่น ตัวอย่างเช่นหากคุณต้องการ GCC 4.4 และ GCC 4.7 บนเครื่องเดียวกันคุณสามารถทำได้ด้วย SCL GCC 4.7 ไม่ได้ติดตั้งบนระบบของคุณจริงๆมันอยู่ในสภาพแวดล้อม SCL มีการติดตั้งเฉพาะรุ่นเก่ากว่า (4.4?) ในการติดตั้งแอพแบบดั้งเดิมให้ใช้ตัวจัดการแพ็คเกจของ distro บน Ubuntu นี้เป็น apt-get sudo apt-get install gccเช่น บน CentOS นี้เป็น yum 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$)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.