Sehr oft befindet sich das Skript, das ich ausführen möchte, nicht in meinem aktuellen Arbeitsverzeichnis und ich möchte es nicht wirklich verlassen.
Ist es eine gute Praxis, Skripte (BASH, Perl usw.) aus einem anderen Verzeichnis auszuführen? Finden sie normalerweise alles, was sie brauchen, um richtig zu laufen?
Wenn ja, wie lässt sich ein "entferntes" Skript am besten ausführen? Ist es
. /path/to/script
oder
sh /path/to/script
und wie sudo
in solchen Fällen zu verwenden? Dies funktioniert zum Beispiel nicht:
sudo . /path/to/script
. /path/to/script
Quelle dient ! Sie benötigen den Zeitraum überhaupt nicht, wenn Sie ihn nur ausführen möchten.Antworten:
sh / path / to / script erzeugt eine neue Shell und führt das Skript unabhängig von Ihrer aktuellen Shell aus. Der
source
Befehl (.) Ruft alle Befehle im Skript in der aktuellen Shell auf. Wenn das Skriptexit
beispielsweise aufruft, verlieren Sie die aktuelle Shell. Aus diesem Grund ist es normalerweise sicherer, Skripte in einer separaten Shell mit sh aufzurufen oder sie als Binärdateien entweder über den vollständigen (beginnend mit /) oder den relativen Pfad (./) auszuführen. Wenn sie als Binärdateien aufgerufen werden, werden sie mit dem angegebenen Interpreter ausgeführt (z. B. #! / Bin / bash).Um zu wissen, ob ein Skript die benötigten Dateien findet oder nicht, gibt es keine gute Antwort, außer das Skript zu betrachten, um zu sehen, was es tut. Optional können Sie in einem Unterprozess jederzeit zum Ordner des Skripts wechseln, ohne den aktuellen Ordner zu verlassen:
quelle
(cd /wherever/ ; sh script.sh)
? Warum hast du eine$
vor?Sie können das definitiv tun (mit den Anpassungen, die die anderen wie
sudo sh /pathto/script.sh
oder mögen./script.sh
). Ich mache jedoch eines der wenigen Dinge, um sie systemweit auszuführen, um mir keine Sorgen um Verzeichnisse zu machen und mir unnötiges zusätzliches Tippen zu ersparen.1) Symlink zu
/usr/bin
(Stellen Sie sicher, dass dort kein überlappender Name vorhanden ist, da Sie ihn offensichtlich überschreiben würden.) Auf diese Weise kann ich sie auch in meinen Entwicklungsordnern behalten, damit ich sie nach Bedarf anpassen kann.
2) Fügen Sie das Skriptverzeichnis zu Ihrem Pfad hinzu (mithilfe von .bash_profile - oder einem beliebigen Profil, das Sie auf Ihrer Shell haben).
PATH=/path/to/scripts/:$PATH
3) Erstellen Sie Alias im
.bash_profile
In und~/.bash_profile
fügen Sie Folgendes hinzu:Wie Sie sehen können, ist die Syntax nur ein Alias, Ziffern, die Sie als Befehl fungieren möchten, der Befehl.
ls -l
Wenn Sie also irgendwo im Terminal "l" eingeben, erhalten Sie Wenn Sie sudo möchten, nuralias sl="sudo ls -l"
um sich selbst l vs sl (als nutzloses Beispiel) zu notieren.In jedem Fall können Sie einfach tippen
sudo nameofscript
und unterwegs sein. Sie müssen sich nicht mit ./ oder. oder sh usw. Markieren Sie sie zuerst als ausführbare Datei: D.quelle
Normalerweise mag ich es, wenn du sagst
Und um es als root / superuser auszuführen
Ihr aktuelles Verzeichnis ist nur wichtig, wenn die Skripte davon ausgehen, dass Sie sich im selben Ordner wie es befinden. Ich würde annehmen, dass die meisten Skripte dies nicht tun und Sie sicher sind, es wie oben auszuführen.
quelle
Normalerweise behalte ich meine Skripte in
/usr/local/bin
oder/usr/local/sbin/
(wenn das Skript Root-Berechtigungen benötigt), wo sie gemäß dem FHS (Filesystem Hierarchy Standard) hingehören.Sie müssen lediglich sicherstellen, dass diese beiden Verzeichnisse zu Ihrem Verzeichnis hinzugefügt werden
PATH
. Sie können dies tun, indem Sie Ihre$HOME/.bashrc
Datei bearbeiten und diese Zeile hinzufügen:Wenn Sie ein Skript als root über ausführen möchten, müssen
sudo
Sie diese Verzeichnisse der Variablensecure_path
in Ihrem hinzufügen/etc/sudoers
.Das Bearbeiten dieser Datei erfolgt durch Ausführen
visudo
, um sicherzustellen, dass Sie keine Fehler haben.quelle
.bashrc
statt.bachrc
.Ich bin mir nicht sicher, ob es unter Linux so funktioniert, vorausgesetzt, es funktioniert nicht, wenn niemand es vorgeschlagen hat. Aber anstatt ././ zu verwenden, um Verzeichnisse zurückzugehen. Können Sie Anführungszeichen verwenden, um einen absoluten Pfad anzugeben? Vielleicht gibt es Ihnen keinen Zugriff auf das gesamte Laufwerk, um überhaupt dazu in der Lage zu sein.
quelle
Wenn Sie Skripte herumliegen haben, die Sie häufig ausführen müssen und die von ihrem Speicherort abhängen, um Ressourcen zu finden, können Sie dies einfach tun, indem Sie einfach Befehle in einem Alias wie diesem kombinieren.
Auf diese Weise müssen Sie nichts anderes ändern, damit es funktioniert.
quelle
Ich bin mir nicht sicher, warum niemand diesen vorgeschlagen hat, aber es ist super einfach! Ich habe ein paar Mal gegoogelt und konnte nicht genau die Antwort finden, die ich gebe, also hatte ich gedacht, ich würde sie teilen. IMO, dies ist aber die beste Lösung, auch die einfachste für mich, wie auch immer andere die Dinge anders fühlen und tun mögen.
Zuerst der Befehl 'cd', der das Verzeichnis des Speicherorts des Skripts angibt. Dann '&&', damit Sie es binden können, nachdem Sie den nächsten Befehl ausgeführt haben. Öffnen Sie Ihr Skript schließlich so, als würden Sie es im Terminal ausführen! Sie werden in Ihrer BASH-Datei gespeichert und die Einrichtung dauert 5 Sekunden.
Hoffe das hat jemandem geholfen.
quelle
Alte Frage, aber eine zeitlose.
Die Lösung, die ich immer wieder gesehen habe, besteht darin, ein
$HOME/bin
Verzeichnis zu haben und es zuerst einzutragen$PATH
(über,~/.bashrc
falls es noch nicht vorhanden ist; auf einigen Systemen~/bin
ist es$PATH
standardmäßig das erste ). Das Ablegen von Skripten zur Ausführung oder von Symlinks zu Skripten / ausführbaren Dateien an anderer Stelle ist die einfache Möglichkeit, Pfadprobleme zu beheben, die das System oder andere Benutzer nicht betreffen sollten.Wenn ein Skript zusätzliche Ressourcen benötigt, die relativ zu seinem eigenen Speicherort gefunden werden können (nicht ungewöhnlich), wird die envvar
$BASH_SOURCE
verwendet.$BASH_SOURCE
enthält immer den absoluten Pfad zum aktuell ausgeführten Skript selbst, unabhängig vom Wert von$PWD
.Folgendes berücksichtigen:
Wir können also sehen, dass dies der
$HOME/bin
erste ist$PATH
, und alles, was ich eingebe~/bin
, läuft. Ich habe ein Demonstrationsskript namens~/bin/findme
:Dies kann verwendet werden, um den absoluten Pfad zum Speicherort des laufenden Skripts abzurufen.
quelle
bin
Verzeichnis verknüpfen sollte ? Das scheint umständlich. (3) Außerdem wird die Standortunabhängigkeit verletzt. Wenn/home/desmond/bin/foo
es sich um einen Link zu meinem Skript handelt, ist diesBASH_SOURCE
der Fall/home/desmond/bin/foo
, und das Skript kann seine Ressourcen nicht finden./bin
oder an einem bekannten Ort installiert/opt
. (3) Die Standortunabhängigkeit ist genau das, was beim Schreiben einer voneinander abhängigen Sammlung persönlicher Skripte erhalten bleibt.