Wie kann man ein Shell-Skript veranlassen, seine Befehle als Quellbefehle auszuführen, ohne den Ausdruck "source scriptname.sh" zum Starten des Skripts verwenden zu müssen? Grundsätzlich möchte ich ./scriptname.sh eingeben und die Befehle so verwenden, als ob source zum Ausführen des Shell-Skripts verwendet wurde.
ubuntu-12.04
shell-script
Andrew-George Hondrari
quelle
quelle
. file
äquivalent istsource file
eigentlichsource
ein „bashism“ (Bash spezifisch) und der Punkt - Operator ist „Standard“ (POSIX).source
Befehl stammt ursprünglich aus Bill Joys csh .Antworten:
In keiner der Unix-Shells können Sie ein Skript als eines markieren, das immer so beschaffen sein sollte, wie Sie es sich erhofft haben. Ich würde ein
alias
oder eine Prozedur erstellen , um das zu tun, was Sie wollen, und es in mein Startskript einfügen. Zum Beispiel in tcsh:In bash könnte man es als Prozedur schreiben:
quelle
"$@"
stattdessen$*
- Ersteres ist die einzig sichere Methode, um Parameter zu übergeben, die möglicherweise Leerzeichen enthalten.Sie können eine Funktion verwenden
bash
, mit der Sie Benutzereingaben abfangen und darauf reagieren können, wobei jede übliche Befehlsausführung außer Kraft gesetzt wird.Fügen Sie Ihrem
bash
Startskript Folgendes hinzu :Dadurch wird die Funktion für jeden ausgeführten Befehl aufgerufen. Wenn es sich um den Namen einer Datei handelt, die nicht ausführbar ist (ansonsten würden wir auch legitime
./foo.sh
Aufrufe blockieren ), wird sie als Quelle verwendet und kein Befehl ausgeführt. Achten Sie auf Dateien mit dem Namenls
oderrm
im selben Verzeichnis. Sie können zusätzliche Sicherheitsvorkehrungen treffen, z. B. die.sh
Dateierweiterung oder denfile
Hinweis, dass der Name eine Textdatei ist.Beispiel:
Erstellen
foo.sh
:Dann:
quelle
foo.sh barrel
aufzurufen, da BASH_COMMAND (und folglich CMD) auf den gesamten einfachen Befehl gesetzt wird und daher der–f
Test fehlschlägt. Ich schlage vor, dass Sie hinzufügeneval set –– "$CMD"
und den–f
Test auf tun$1
; dannsource "$@"
.ls
oderrm
im selben Verzeichnis." Könnte erweitert werden: " Beachten Sie, dass nicht ausführbare Dateien im aktuellen Verzeichnis die normale Befehlsverarbeitungslogik der Shell vollständig beeinträchtigen." ich sage das , weil auch (nicht ausführbare Dateien) wiealias
,export
,history
,jobs
, etc ..., wird bezogen werden, zu ignorieren und überschreiben ihre Definition als builtin Befehle.[[ ! –x "$CMD" ]]
Faktor –– Skripten, für die der ausführbare Modus festgelegt ist, derauto_source_names
Rückkehrcode 0 (Null) nicht mehr ausreicht, wodurch die Shell angewiesen wird, sie normal zu verarbeiten..sh
Erweiterung zu fordern .) Ich hätte Angst, etwas zu schreiben, wieconv.c
wenn ichcc conv.c
oder meintevi conv.c
, und die Shellsource
meine C-Quelldatei zu haben. (Ich würde nicht wirklich erwarten, dass irgendetwas in einer C-Quelldatei ein gültiger Unix-Befehl ist, aber ich würde auch nicht den harten Weg herausfinden wollen.)Die erste Zeile muss den Pfad zum Interpreter enthalten:
#! /bin/bash
Dann machen Sie die Skriptdatei ausführbar:
chmod +x scriptname.sh
Jetzt können Sie ausführen
./scriptname.sh
, um es auszuführen.quelle
source
Anweisung bewirkt, dass das Skript ausgeführt wird, ohne dass diese Isolation erzeugt wird. Alle Befehle im Skript werden von Ihrer Kopie der Shell ausgeführt und können ihren Status ändern.