2017-01-25 4 views
0

Ich schreibe ein Skript, das eine Ersteinrichtung erfordert. das Setup ist in Form von Csh-Skript, das viele Artefakte auf den Umgebungsvariablen hat. gerade jetzt, wenn ich die csh innerhalb der Bash ausführen, bleiben die Variablen innerhalb der Subshell der Bash unverändert.Ausführen von Csh-Skript aus Bash-Skript

Beispiel:

#!/bin/bash 
echo $PATH 
setevnvar.csh -dir $ROOT_DIR/ 
echo $PATH 

in diesem Beispiel möchte ich sehen, dass der PATH-Variable nach dem Ausführen des csh-Skript geändert wird (es ist eines der Ergebnisse)

irgendwelche Gedanken schätzen würde.

+1

Ein 'csh'-Skript (das eine Erweiterung wie' .csh' haben sollte, falls vorhanden, nicht '.sh') kann Variablen in einem' bash'-Skript nicht direkt setzen. – chepner

+0

Wenn Sie sagen, ist in der Form von Csh-Skript, das viele Artefakte auf den Umgebungsvariablen hat -> Die Umgebungsvariablen unter 'csh' oder' bash'? – Inian

+0

die Variablen sind in der csh gesetzt – YAO

Antwort

1

Es ist nicht möglich, die Variablen einer Shell von einem untergeordneten Prozess zu ändern. Da das Starten von csh von bash einen untergeordneten Prozess startet, gibt es keine Möglichkeit, die getan werden kann.

Optionen Sie haben:

  • Konvertieren Sie Ihre csh Skript bash und source es von Ihrem bash Skript.
  • Konvertieren Sie Ihre bash Skript csh und wieder source das andere Skript
  • die Variablen Achten Sie darauf, für export im csh Skript markiert müssen, und Ihr Bash-Skript starten aus dem Inneren des Skript csh (das kann oder nicht arbeiten für Ihren spezifischen Bedarf), wodurch die Dinge von innen nach außen
  • Merge den Code aus beiden Skripten Drehen eines einzigen haben (bash oder csh) Skript

„Beschaffung "ist mit einem . oder dem (nicht-POSIX) source Built-in gemacht. Zum Beispiel:

#!/bin/bash 
echo $PATH 
. setevnvar.converted_to_bash -dir "$ROOT_DIR/" 
echo $PATH 

„Sourcing“ bewirkt, dass der aktuellen Prozess Befehle aus einer anderen Datei und führen sie zu lesen, als ob sie Teil des aktuellen Skripts waren, anstatt eine neue Shell starten, dass andere Datei auszuführen. Aus diesem Grund funktionieren Variablenzuweisungen mit dieser Methode.

Bitte beachten Sie, dass ich Ihrer Erweiterung "$ROOT_DIR/" doppelte Anführungszeichen hinzugefügt habe, um den Fall zu schützen, in dem Sonderzeichen wie Leerzeichen enthalten wären.

+0

danke! Also, wenn ich zwei csh-Skripte habe, dann wird der Source-Befehl die äußere Shell beeinflussen (nachdem das Skript beendet wurde)? – YAO

+0

Sie müssen zwei Skripte vom selben Interpreter ausführen lassen (kann 'csh' sein, wenn Sie möchten), aber Sie * müssen * das Skript aufrufen, indem Sie es wie oben gezeigt, wenn nicht, haben Sie das gleiche Problem. "Sourcing" bewirkt, dass der aktuelle Prozess Befehle aus einer anderen Datei liest, als ob sie Teil des aktuellen Skripts wären, anstatt eine neue Shell zu starten, um diese andere Datei auszuführen. – Fred

+0

Interessanterweise ist 'source' nicht' bash'-spezifisch, es kommt von 'csh'! Der Effekt ist in POSIX nicht angegeben. – cdarke