Wie man laufen ein csh-Skript von einem sh-Skript
Ich Frage mich, ob es ist ein Weg, um Quelle eine csh-Skript von einem sh-script. Unten ist ein Beispiel der was versucht, umgesetzt werden:
script1.sh:
#!/bin/sh
source script2
skript2:
#!/bin/csh -f
setenv TEST 1234
set path = /home/user/sandbox
Wenn ich sh script1.sh, bekomme ich syntax Fehler aus skript2 (rechnen, da wir mit einer anderen Kram). Gibt es eine Möglichkeit, ich kann laufen, skript2 durch skript1?
InformationsquelleAutor user3245776 | 2014-01-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Statt
source script2
ausführen als:InformationsquelleAutor anubhava
Da Ihre Nutzung Fall hängt die Beibehaltung von Umgebungsvariablen gesetzt, die von der
csh
Skript, versuchen Sie diese zu Beginn desscript1
:Wenn die
csh_executed
variable nicht auf 1 festgelegt ist, in der Umgebung, führen Sie einecsh
Skript, dass die Quellenscript2
führt dann eine Instanz vonsh
, das wird behalten die änderungen an der Umgebung vorgenommen inscript2
.exec
wird verwendet, um zu vermeiden, die Schaffung neuer Prozesse für die einzelnen shell-Instanz, statt einfach nur "Umschalten" von einer Schale zur nächsten. Einstellungcsh_executed
in der Umgebung dercsh
Befehl sorgt dafür, dass wir nicht stecken in einer Schleife, wennscript1
ist re-ausgeführt durch diecsh
Instanz.Leider einen Nachteil gibt es, glaube ich, nicht behoben werden kann, zumindest nicht mit meinem begrenzten wissen von
csh
: der zweite Aufruf vonscript1
erhält alle ursprünglichen Argumente als eine einzige Zeichenfolge, sondern als eine Abfolge von unterschiedlichen Argumenten.InformationsquelleAutor chepner
Wollen Sie nicht
source
es; es läuft das Skript in Ihrem bestehenden Schale, ohne Laichzeit einen Teilprozess. Offensichtlich, Ihre sh-Prozess nicht ausgeführt werden kann, dass so etwas wie das ist nicht ein sh-Skript.Nur rufen Sie das Skript direkt, vorausgesetzt, es ist ausführbar:
InformationsquelleAutor Wooble
Die nächstgelegene Sie kommen können, um sourcing ein Skript mit einem anderen Testamentsvollstrecker als Ihre original-Skript zu verwenden
exec
.exec
ersetzt den Laufenden Prozess Raum, mit dem neuen Prozess. Im Gegensatz zusource
jedoch, wenn Ihrexec
-ed-Programm endet, wird der gesamte Prozess beendet wird. Damit Sie dies tun können:aber Sie können nicht dies tun:
Jedoch, sind Sie sicher, dass Sie wirklich wollen, um Quelle das Skript? Vielleicht wollen Sie nur, um es auszuführen in einem Teilprozess:
InformationsquelleAutor kojiro
Möchten Sie die Einstellungen in Ihrem csh-Skript zu übernehmen, um das sh-Skript aufruft.
Im Grunde, können Sie nicht tun, dass, obwohl es ein paar (ziemlich hässliche) Möglichkeiten, wie Sie es schaffen konnte. Wenn Sie ausführen Ihre csh-Skript, es werden jene Variablen, die im Kontext des Prozesses, der das Skript ausführt; Sie werde verschwinden, sobald er kehrt zum Aufrufer zurück.
Ihre beste Wette ist, einfach zu schreiben eine neue version der csh-Skript als ein sh-Skript, und
source
oder.
es von der aufrufenden sh-Skript.Könnte man übersetzen Ihre csh-Skript:
:
(csh behandelt die shell-array variable
$path
speziell, binden Sie es, um die Umgebungsvariable$PATH
. sh und seine Derivate nicht tun, beschäftigen Sie sich mit$PATH
sich selbst direkt.)Beachten Sie, dass ein Skript gedacht, bezogen werden, sollte nicht haben eine
#!
Linie an der Oberseite, da es nicht Sinn machen, um ihn auszuführen, in seinem eigenen Prozess, müssen Sie ausführen, deren Inhalt im Kontext des Aufrufers.Wenn die zwei Kopien des Skripts zu
source
d von csh oder tcsh-Skripte und anderesource
d oder.
ed von sh/ksh/bash/zsh-Skript, ist nicht praktisch, es gibt andere Lösungen. Zum Beispiel, kann Ihr Skript zu drucken eine Reihe vonsh
- Befehle ausgeführt werden; Sie können dann etwas tun, wie(Zeilenenden stellen einige Themen hier).
Oder ändern Sie die csh-Skript, so legt er die erforderlichen Umgebungsvariablen und startet dann einen bestimmten Befehl, der könnte eine neue interaktive shell; dies ist unbequem, da es nicht die Variablen, die in der interaktiven shell Sie ausführen.
Wenn ein software-Paket erfordert einige spezielle Umgebungsvariablen zu setzen, es ist gängige Praxis, bieten Aufgabenstellungen, zum Beispiel
setup.sh
undsetup.csh
, so, sh/ksh/bash/zsh-Nutzer tun können:und csh/tcsh-Benutzer tun können:
Übrigens, mit diesem Befehl:
in deinem Beispiel-script ist wahrscheinlich nicht eine gute Idee. Es ersetzt Ihre gesamte
$PATH
mit nur einem einzigen Verzeichnis, was bedeutet, dass Sie nicht in der Lage zum ausführen von einfachen Befehlen wiels
es sei denn, Sie geben Ihre volle Pfade. Sie würden in der Regel wollen Sie so etwas wie:oder, in den sh:
InformationsquelleAutor Keith Thompson