2016-08-18 1 views
0

Ich habe ein Bash-Skript, das rbenv zu /usr/local installiert und fügt die erforderlichen Umgebungsvariablen zu /etc/profile. Mein Benutzer ist root:Quelle/etc/Profil in Bash-Skript

#!/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 

Jedoch wird die PATH-Variable nicht exportiert werden, wie es sollte, aber RBENV_ROOT ist!

~#: 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 

ich erwarten würde /usr/local/rbenv/ als Teil des Pfades zu sehen, nicht wahr?

ich auch habe versucht, die Syntax Hochschalten für den Pfad hinzugefügt, aber das half auch nicht:

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

Falls Sie sich fragen, ich bin die Ausgabe umleiten, weil dies alles innerhalb ein Whiptail-Menü.

Also, warum würde eine Variable RBENV_ROOT angezeigt werden, aber nicht meine angeblich aktualisierte PATH?

Antwort

2

Die Sequenz >>/etc/profile >&$log_fd 2>&1 die echo bewirkt mit stdout und Stderr Deskriptor $log_fd, nicht zu /etc/profile Datei umgeleitet laufen. Das liegt daran, dass die Umleitungen in diesem Fall von links nach rechts verarbeitet werden, und die zweite überschreibt die erste, wenn es zu stdout kommt. Um dies zu sehen:

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

Make diese ausführbare Datei, führen Sie es, dann prüfen Sie, ob hello erscheint nur in /tmp/file1.

Natürlich erklärt das nicht, warum RBENV_ROOT gesetzt ist. Vielleicht hast du es in eine andere Startup-Datei gesetzt?

Wie für die Verwendung echo 'export PATH=$PATH:/usr/local/rbenv/bin' >>/etc/profile', kann ich bestätigen, dass wenn ich das auf Ubuntu 14.04, sehe ich das neue Verzeichnis als Teil von PATH, wie erwartet. Um die Änderung zu sehen, müssen Sie jedoch sicherstellen, /etc/profile wird bezogen, was nur passiert, wenn Sie eine Login-Shell starten. Zum Beispiel env -i bash -lc 'echo $PATH'.

+0

Das ist das Problem, mit dem ich es zu tun habe ... kann ich es aus dem selben Skript beziehen, so dass ich keine neue Login-Shell starten muss? – Godzilla74

+0

Könnte 'rbenv init - --no-rehash'' 'PATH' 'zurückstellen ?! –