Verwenden des Quellbefehls mit dem Dialog

423
Asaf Magen

Ich versuche, ein umfangreiches Skript mit vielen Funktionen zu erstellen, die einige Zeit in Anspruch nehmen. Ich möchte in der Zwischenzeit einen Dialog "Sourcing bitte warten ..." präsentieren. Einmal fertig, möchte ich meine Funktionen nutzen. Das Verwenden des Dialogs scheint jedoch das Sourcing aufzuheben. Das Sourcing wird mit dem Dialog verarbeitet, aber die Funktion wird nicht ausgeführt.

Datei: main.script.sh

#!/bin/bash  long task...  function PrintDate(){ date } 

Datei: job1.sh

#!/bin/bash source main.script.sh | dialog --progressbox "sourcing please wait..." 20 80 PrintDate 

Eingabeaufforderung:

bash job1.sh 

Ausgabe bekomme ich

PrintDate: command not found 
0

1 Antwort auf die Frage

1
G-Man

Nit Plektren:

  1. Ihre "Shebangs" sind falsch - sie sollten beginnen #!.
  2. Sie benötigen eigentlich keinen "Shebang" in einer Datei, die beschafft werden soll. Möglicherweise möchten Sie die Einstellung deaktivieren, damit klar ist, dass die Datei beschafft werden soll und nicht als gewöhnliches Skript ausgeführt werden soll. (Im Besonderen sollten Sie es wahrscheinlich mit einem Kommentar beginnen, der ungefähr so ​​aussieht
    # This file is meant to be sourced and not run as an ordinary script.)
  3. Streng genommen brauchen Sie keinen "Shebang" in einer Datei, die vorbeigeführt werden soll, obwohl es nicht weh tut.bash scriptname
  4. Natürlich bekommst du PrintDate: command not found. Ihre main.script.shDatei definiert nicht PrintDate. es ist bestimmend PritnDate.

Die eigentliche Antwort auf Ihre Frage lautet jedoch:

  1. Der springende Punkt source ist, dass das Quell-Skript im aktuellen Main-Shell-Prozess gelesen und interpretiert wird. Wenn Sie es jedoch zu einer Pipeline machen, erzwingen Sie es, dass es in einem untergeordneten Prozess ausgeführt wird.
  2. Der Trick besteht darin, eine Pipe zu erstellen, ohne eine Pipeline zu erstellen. Der Trick dabei ist die Prozessersetzung (eine Bash-Erweiterung für die Befehlsersetzung ). Dieser Befehl:

    source main.script.sh > >(dialog --progressbox "sourcing please wait..." 20 80) 

    erstellt einen untergeordneten Prozess, um das dialogProgramm auszuführen, und erstellt eine Pipe vom Haupt-Shell-Prozess zu diesem untergeordneten Prozess. Diese Pipe sieht dann jedoch wie eine gewöhnliche Datei aus und sendet die Ausgabe des sourceBefehls an die Pipe, während sie erstellt wird Sieht aus wie eine gewöhnliche Umleitung der Standardausgabe. Daher wird der sourceProzess im Hauptshell-Prozess ausgeführt (in diesem Fall ist der bashProzess, mit dem das job1.shSkript ausgeführt wird), und Ihre Funktionen werden daher im job1.shSkript definiert .

ive entsprechend Ihren Anmerkungen korrigiert. Es war nur ein Tippfehler von meiner Seite und danke, das funktioniert für mich! Asaf Magen vor 7 Jahren 0