Was ist der beste Weg, um ein Skript auszuführen, wenn Sie in ein Verzeichnis eintreten?
Wenn ich in ein neues Verzeichnis wechsle, möchte ich, dass Bash das Skript projectSettings.bash ausführt, ähnlich wie RVM.
Was ist der beste Weg, um ein Skript auszuführen, wenn Sie in ein Verzeichnis eintreten?
Wenn ich in ein neues Verzeichnis wechsle, möchte ich, dass Bash das Skript projectSettings.bash ausführt, ähnlich wie RVM.
Antworten:
Sie können cd
eine Funktion (und pop
und pushd
) erstellen und erkennen lassen, ob Sie dieses bestimmte Verzeichnis betreten.
cd () { builtin cd "$@" && chpwd; }
pushd () { builtin pushd "$@" && chpwd; }
popd () { builtin popd "$@" && chpwd; }
unset_all_project_settings () {
# do whatever it takes to undo the effect of projectSettings.bash,
# e.g. unset variables, remove PATH elements, etc.
}
chpwd () {
case $PWD in
/some/directory|/some/other/directory) . ./projectSettings.bash;;
*) unset_all_project_settings;;
esac
}
Tun Sie dies nicht in Verzeichnissen, die Sie nicht auf die Whitelist gesetzt haben, da es für jemanden sehr einfach wäre, Sie zum Ausführen von beliebigem Code zu verleiten. Senden Sie ein Archiv, entpacken Sie es, wechseln Sie in das erstellte Verzeichnis und Führen Sie jetzt den Code des Angreifers aus.
Ich empfehle diesen Ansatz nicht, da er bedeutet, dass das Skript ausgeführt wird, selbst wenn Sie dieses Verzeichnis aus einem Grund eingeben, der nichts mit der Arbeit am Projekt zu tun hat. Ich schlage vor, über eine bestimmte Funktion zu verfügen, die sich im Projektverzeichnis ändert und das Einstellungsskript als Quelle verwendet.
myproj () {
cd /some/directory && . ./projectSettings.bash
}
cd
und es gibt ohne Zweifel einen besseren Weg. Sogar mit $ PROMPT_COMMAND ist besser!
if [ -z $MYSETTINGS ] ; then export MYSETTINGS=1 ; echo your settings here ; fi
. Dies dient zur Vermeidung von Problemen, falls Sie eine Initialisierung mit PATH = / mytools / bin: $ PATH durchführen.
direnv könnte das sein, wonach du suchst.
Hier ist ein Beispiel aus der offiziellen Dokumentation:
$ cd ~/my_project
$ echo ${FOO-nope}
nope
$ echo export FOO=foo > .envrc
.envrc is not allowed
$ direnv allow .
direnv: reloading
direnv: loading .envrc
direnv export: +FOO
$ echo ${FOO-nope}
foo
$ cd ..
direnv: unloading
direnv export: ~PATH
$ echo ${FOO-nope}
nope