Warum ist die Variable $PATH zwischen zwei Verzeichnissen unterschiedlich?

Warum ist die Variable $PATH zwischen zwei Verzeichnissen unterschiedlich?

Wenn ich in einem Verzeichnis bin und den Echopfad

pwd
/Users/me/src/some_proj

echo $PATH
/Users/me/.gem/ruby/2.0.0/bin:/opt/boxen/chruby/versions/2.0.0-
p353/lib/ruby/gems/2.0.0/bin:/opt/boxen/chruby/versions/2.0.0-
p353/bin:bin:/opt/boxen/chruby/bin:/opt/boxen/ruby-
build/bin:node_modules/.bin:/opt/boxen/nodenv/shims:/opt/boxen/nodenv/bin:
/opt/boxen/bin:/opt/boxen/homebrew/bin:/opt/boxen/homebrew/sbin:
/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin

Wenn ich mich in einem anderen Verzeichnis befinde und den Echopfad

pwd
/Users/me/src_personal/my_gems/som_gem

echo $PATH
bin:/opt/boxen/chruby/bin:/opt/boxen/ruby-build/bin:
node_modules/.bin:/opt/boxen/nodenv/shims:/opt/boxen/nodenv/bin:
/opt/boxen/bin:/opt/boxen/homebrew/bin:/opt/boxen/homebrew/sbin:
bin:/opt/boxen/chruby/bin:/opt/boxen/ruby-build/bin:
node_modules/.bin:/opt/boxen/nodenv/shims:/opt/boxen/nodenv/bin:
/opt/boxen/bin:/opt/boxen/homebrew/bin:/opt/boxen/homebrew/sbin:
bin:/opt/boxen/chruby/bin:/opt/boxen/ruby-build/bin:
node_modules/.bin:/opt/boxen/nodenv/shims:/opt/boxen/nodenv/bin:
/opt/boxen/bin:/opt/boxen/homebrew/bin:/opt/boxen/homebrew/sbin:
/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin

Ich erhalte einen anderen $PATH. Ich dachte, $PATH wäre eine globale Variable in der Shell, die sich nicht ändert. Warum sind diese Pfade in verschiedenen Verzeichnissen unterschiedlich?

Antwort1

Ich weiß, dass dies eine alte Frage ist, aber vor kurzem sind einige neue Ruby-Benutzer auf dieses „scheinbar unmögliche“ Verhalten gestoßen. Ich antworte, um anderen zu helfen, die auf dasselbe gestoßen sind.

Das liegt daran, dass Sie Ruby verwenden, das lokale Bundle- und Gem-Einstellungen für jedes Verzeichnis anwendet. Ihre PATH-VariableIstÄnderung einfach aufgrund eines CD-Befehls – weil Ruby die CWD-Änderung verarbeitet und die richtigen Einstellungen für dieses Zielverzeichnis (oder globale Einstellungen, wenn in CWD keine Konfigurationen vorhanden sind) auf die Umgebung anwendet.

Ein sehr häufiges Szenario besteht darin, dass ein Ruby-Benutzer den Bundle-Befehl ausführt, der sich eindeutig im Pfad befindet (versuchen Sie es mit „which bundle“), das Verzeichnis wechselt und dann feststellt, dass der Bundle-Befehl unbekannt ist (nicht mehr im Pfad, da sich der Pfad als Nebeneffekt des CD-Befehls geändert hat).

Normalerweise kann dies durch die Installation eines Gems im problematischen Verzeichnis behoben werden.

Antwort2

In der Shell gibt es keine globalen Variablen, also Variablen, die von verschiedenen Instanzen (Prozessen) gemeinsam genutzt werden. Exportierte Variablen werden in untergeordnete Prozesse kopiert, sind von dort aber unabhängig.

verwandte Informationen