2016-08-18 51 views
0

我有一个bash脚本,安装rbenv/usr/local,并将所需的环境变量添加到/etc/profile。我的用户是rootbash脚本中的源/ etc/profile

#!/bin/bash 

exec {log_fd}>log.txt 

git clone https://github.com/rbenv/rbenv.git /usr/local/rbenv >&$log_fd 2>&1 
git clone https://github.com/rbenv/ruby-build.git /usr/local/rbenv/plugins/ruby-build >&$log_fd 2>&1 
echo 'export RBENV_ROOT=/usr/local/rbenv' >> /etc/profile >&$log_fd 2>&1 
echo 'export PATH="/usr/local/rbenv/bin:$PATH"' >> /etc/profile >&$log_fd 2>&1 
echo 'if which rbenv > /dev/null; then eval "$(rbenv init - --no-rehash)"; fi' >> /etc/profile >&$log_fd 2>&1 
. /etc/profile 

然而,PATH变量没有被导出,因为它应该,但RBENV_ROOT是!

~#: printenv 
RBENV_ROOT=/usr/local/rbenv 
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games 
MAIL=/var/mail/root 
LANG=en_US.UTF-8 
RBENV_SHELL=bash 

我希望看到/usr/local/rbenv/作为路径的一部分,对不对?

我也试着开关了语法添加的路径,但是这并没有帮助:

echo 'export PATH=$PATH:/usr/local/rbenv/bin' >> /etc/profile 2>&1 

在你想知道的情况下,我将输出重定向,因为这是所有的内一个whiptail菜单。

那么,为什么要显示一个变量RBENV_ROOT,但不是我所谓的更新PATH

回答

2

序列>>/etc/profile >&$log_fd 2>&1导致echo以stdout和stderr重定向到文件描述符$log_fd而不是/etc/profile。这是因为重定向在这种情况下是从左到右处理的,而第二个涉及到stdout时会覆盖第一个。要看到这一点:

#!/bin/bash 
exec {fd}>/tmp/file1 
echo 'hello' >>/tmp/file2 >&$fd 2>&1 

将这个可执行文件,运行它,然后检查hello只出现在/tmp/file1

当然,这并不能解释为什么RBENV_ROOT集合。也许你把它设置在其他启动文件中?

至于使用echo 'export PATH=$PATH:/usr/local/rbenv/bin' >>/etc/profile',我可以确认,如果我在Ubuntu 14.04上这样做,我会如预期的那样将新目录看作PATH的一部分。但是,要查看更改,您必须确保/etc/profile来源,只有当您启动登录shell时才会发生这种情况。例如,env -i bash -lc 'echo $PATH'

+0

这就是我正在处理的问题......我可以从相同的脚本中获取它,因此我不必启动新的登录shell? – Godzilla74

+0

可以'rbenv init - --no-rehash'重置'PATH' ?! –