
Ich habe eine Anwendung, die ich ausführen kann, während ich mich am folgenden Dateispeicherort befinde:
-$ cd home/myApps/app
-$ ./run.sh
Ich möchte run.sh von überall in meinem Terminal aufrufen, ohne im vollständigen Pfad zu sein. Ich habe versucht, Alais zu verwenden und den folgenden Code zur Bashrc-Datei hinzuzufügen.
alias mylovleyapp=/home/myApps/app/run.sh
das Problem ist, dass das Programm jedes Mal, wenn ich die App mit mylovleyapp ausführen möchte, einen Fehler zurückgibt, da run.sh von anderen Dateien im Ordner myApps abhängig ist
Wie kann ich das erreichen?
Antwort1
Viele Wege führen nach Rom.
Alias
Wenn Sie einen Alias bevorzugen, können Sie Folgendes tun:
alias mylovleyapp='(cd home/myApps/app && ./run.sh)'
Die Klammern (...)
bewirken, dass die beiden Befehle in einer Subshell ausgeführt werden. Ihr aktuelles Verzeichnis hat sich daher nach Beendigung des Programms nicht geändert.
Ein Wrapper-Skript in Ihrem PATH
Stattdessen können Sie ein Wrapper-Skript erstellen und es in einem Ordner ablegen, der sich in Ihrer Suche befindet PATH
, z. B. ~/.local/bin
wenn ~/bin
Sie der einzige Benutzer sind, der Zugriff benötigt, oder /usr/local/bin
wenn alle Benutzer Zugriff benötigen. Dann müssen Sie nur noch den Namen des Skripts eingeben, um das Programm zu starten.
Das Skript kann genau das sein, was Sie normalerweise tun, um das Programm zu starten:
#!/usr/bin/env bash
cd home/myApps/app
./run.sh
Speichern Sie das Skript beispielsweise als ~/.local/bin/mylovleyapp
. Machen Sie das Skript ausführbar, damit es ausgeführt werden kann:
chmod +x ~/.local/bin/mylovleyapp
Wenn ~/.local/bin
es nicht existierte und Sie es erstellen mussten, melden Sie sich ab und wieder an, damit es automatisch in Ihr aufgenommen wird PATH
. Von nun an mylovleyapp
reicht eine Eingabe in das Terminal, um Ihre App auszuführen.
Antwort2
Da der OP kein Beispielskript bereitgestellt hat, werde ich eines erstellen. Es wird eines tun. Es wird ls
im Verzeichnis des Skripts ausgeführt.
Ja, ich weiß, dass Sie einfach
ls
auf das verzichten können./
. Aber für dieses Beispiel tue ich so, als wäre es erforderlich, um ein Skript zu demonstrieren, das das aktuelle Verzeichnis des Skripts verwendet.
#!/usr/bin/env bash
ls ./
Speichern Sie das Skript irgendwo. Ich speichere es als /home/ubuntu/test/myscript
. Machen Sie es mit ausführbar chmod +x /home/ubuntu/test/myscript
. Gehen Sie nun cd
in das Verzeichnis, in dem sich das Skript befindet (z. B. cd /home/ubuntu/test
), und führen Sie das Skript mit aus ./myscript
:
ubuntu@computer:~/test$ ./myscript
myscript someRandomFile
So weit, so gut. Aber jetzt führen wir es aus einem anderen Verzeichnis aus. Für dieses Beispiel werde ich es aus dem Stammverzeichnis ( /
) ausführen.
ubuntu@computer:~/test$ cd /
ubuntu@computer:/$ /home/ubuntu/test/myscript
bin dev home lib lib64 lost+found mnt proc run snap sys usr
boot etc init lib32 libx32 media opt root sbin srv tmp var
Hoppla. Wir wollten, dass die Dateien am Speicherort des Skripts gedruckt werden, nicht am Speicherort des Benutzers. Bevor wir die Lösung herausfinden, denken Sie darüber nachWarumes tut dies für einen Moment. Die Antwort ist einfach. ./
ist relativ zu derBenutzeraktuelles Verzeichnis, nicht das des Skripts.
Um das Verzeichnis des Skripts aus dem Skript heraus zu erhalten, schauen wir uns andiese Stack Overflow-Frage.
Der Kern der Sache ist einfach: Es script_dir="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
wird das aktuelle Verzeichnis des Skripts abgerufen und in der Variablen gespeichert script_dir
.
Aktualisieren wir das Skript entsprechend. Unser Skript sieht nun so aus:
#!/usr/bin/env bash
script_dir="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
ls "$script_dir"
Lassen Sie es uns ausführen und sehen, ob es funktioniert:
ubuntu@computer:/$ /home/ubuntu/test/myscript
myscript someRandomFile
Es funktioniert! Es druckt die Dateien im Verzeichnis des Skripts, selbst wenn Sie sich nicht im selben Verzeichnis wie das Skript befinden. Wir sind fertig. Die Grundidee ist einfach. Im Skript ./
bezieht sich auf das Verzeichnis des Benutzers. "$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
bezieht sich auf das Verzeichnis, in dem sich das Skript befindet. Aktualisieren Sie Ihr Skript entsprechend, dann sollte es funktionieren.
Antwort3
Sie müssen Ihren App-Pfad zur PATH-Variable hinzufügen. Um dies vorübergehend zu tun, gehen Sie in das Verzeichnis, in dem sich Ihre App befindet, und dann:
PATH=.:$PATH
Sie können Ihre App nun von überall aufrufen, ohne den vollständigen Pfad eingeben zu müssen. Wenn Sie das Terminal schließen, geht diese Einstellung verloren.
Um es dauerhaft festzulegen, müssen Sie Ihre .bashrc-Datei bearbeiten und :/home/myApps/app am Ende Ihres PATH hinzufügen. Speichern Sie die neue .bashrc-Datei und dann:
source .bashrc
Antwort4
Sie müssen daher Ihr Arbeitsverzeichnis in das Verzeichnis ändern, in dem sich die Zielanwendung befindet, und dann die Anwendung ausführen, damit sie die abhängigen Dateien finden kann.
Ich denke, Sie können dies tun, indem Sie im Alias zwei separate Befehle angeben: einen zum Ändern des Verzeichnisses und den anderen zum Ausführen des Programms, getrennt durch ein Semikolon.
Ihr .bashrc
Zusatz sollte also lauten:
alias mylovleyapp='cd /home/myApps/app; ./run.sh'
Dies setzt voraus, dass sich die abhängigen Dateien hier befinden /home/myApps/app
. Wenn nicht, können Sie das Arbeitsverzeichnis in das Verzeichnis mit den abhängigen Dateien ändern und die App dann mit einem absoluten Pfad als zweite Komponente ausführen.