Wie kann ich eine Anwendung von überall im Terminal ausführen, ohne den vollständigen Pfad einzugeben?

Wie kann ich eine Anwendung von überall im Terminal ausführen, ohne den vollständigen Pfad einzugeben?

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/binwenn ~/binSie der einzige Benutzer sind, der Zugriff benötigt, oder /usr/local/binwenn 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/bines 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 mylovleyappreicht 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 lsim Verzeichnis des Skripts ausgeführt.

Ja, ich weiß, dass Sie einfach lsauf 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 cdin 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 .bashrcZusatz 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.

verwandte Informationen