2016-08-18 55 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' ?! –