bash脚本

时间:2016-08-18 18:40:05

标签: linux bash ubuntu rbenv

我有一个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

1 个答案:

答案 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'