Ich versuche, ein Befehlszeilentool bash
zu schreiben, das unmittelbar nach der Installation verwendet werden kann, d. H. In der Shell, in der das Installationsskript aufgerufen wurde. Läßt install-script.sh
sagen (entworfen für Ubuntu) sieht so aus:Bash-Skript zur Aktualisierung der Umgebung der übergeordneten Shell abrufen
# Get the script's absolute path:
pushd `dirname $0` > /dev/null
SCRIPTPATH=`pwd`
popd > /dev/null
# Add lines to bash.bashrc to export the environment variable:
echo "SCRIPT_HOME=${SCRIPTPATH}" >> /etc/bash.bashrc
echo "export SCRIPT_HOME" >> /etc/bash.bashrc
# Create a new command:
cp ${SCRIPTPATH}/newcomm /usr/bin
chmod a+x /usr/bin/newcomm
Die Idee ist, dass der neue Befehl newcomm
verwendet den SCRIPT_HOME
Umgebungsvariable das Hauptskript zu verweisen - die auch in SCRIPTPATH
ist:
exec "${SCRIPT_HOME}/main-script.sh"
Jetzt wurde die aktualisierte bash.bashrc
noch nicht in die Parent-Shell geladen. Schlimmer noch, ich kann nicht source
es aus dem Skript - die in einer untergeordneten Shell ausgeführt wird. Die Verwendung von export
, um SCRIPT_HOME
in der übergeordneten Shell zu ändern, wäre im besten Fall ein Problem mit dem Channel-Taping, aber selbst dies ist unmöglich. Beachten Sie außerdem, dass das Installationsskript unter Verwendung von sudo
ausgeführt werden muss, damit es nicht von der übergeordneten Shell mithilfe von source
aufgerufen werden kann.
Es sollte möglich sein, da Paketmanager wie apt
es tun. Gibt es eine robuste Möglichkeit, meinen Ansatz zu verbessern? Wie wird das normalerweise gemacht, und gibt es eine gute Anleitung zum Schreiben von Bash-Installern?
"* Paketmanager wie apt tun es. *" - Ich glaube nicht, dass das wahr ist. Haben Sie Beweise, die diese Behauptung stützen? –
Wenn Sie sich an nichts anderes mehr über Shell-Programmierung erinnern, denken Sie daran, * ein Skript kann die Umgebung seiner Eltern nicht ändern *.Dies ist nur eine andere Möglichkeit, auszudrücken, dass eine * Untershell die Umgebung ihrer Eltern nicht ändern kann *. Ich glaube, das ist ein Fall, in dem "Nein, wirklich bedeutet ... Nein" –
@Rob Ich meine nicht, Paket-Manager tun alles andere als mein ultimatives Ziel hier zu erreichen, um den Befehl sofort nach der Installation zugänglich zu machen. – Ixxie