在 CentOS 6.4 上:
我安装了较新版本的 devtoolset (1.1),并想知道如何将它们永久设置为默认值。现在,当我 ssh 进入运行 CentOS 6 的服务器时,我必须运行此命令scl enable devtoolset-1.1 bash
我尝试将其添加到 ~/.bashrc 并简单地将其粘贴到最后一行,但没有成功。
答案1
在您的~/.bashrc
或~/.bash_profile
简单地获取开发工具集提供的“启用”脚本。例如,使用 Devtoolset 2,命令为:
source /opt/rh/devtoolset-2/enable
或者
source scl_source enable devtoolset-2
效率更高:没有叉子炸弹,没有棘手的外壳
答案2
的替代方案source /opt/rh/devtoolset-4/enable
是
source scl_source enable devtoolset-4
上面的 shell 脚本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 中时,它会创建一个新的 shell...加载您的 .bashrc,运行scl enable devtoolset-1.1 bash
,创建一个新的 shell,加载您的 .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,第一个将继续 forkbomb,并且如果您的本机环境有 gcc 4.7.2,也将无法工作。
- 这将创建一个新的外壳,如上所述。因此,当您创建终端窗口或 ssh 会话时,您将处于两个 bash 会话中,并且必须进行
exit
两次。
答案4
为所有用户跨系统启用它。请在“ /etc/profile
”中进行如下修改:
source scl_source enable devtoolset-2