我有一个bash脚本,可以将rbenv
安装到/usr/local
,并将所需的环境变量添加到/etc/profile
。我的用户是root
:
#!/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/
作为PATH的一部分,对吗?
我还尝试更改添加路径的语法,但这并没有帮助:
echo 'export PATH=$PATH:/usr/local/rbenv/bin' >> /etc/profile 2>&1
如果你想知道,我正在重定向输出,因为这都在whiptail菜单中。
那么,为什么会显示一个变量RBENV_ROOT
而不是我认为更新的PATH
?
答案 0 :(得分: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'
。