Ihr Shell-Skript wurde nicht beendet. Es läuft noch. Sie erhalten eine Eingabeaufforderung, weil script spawnt eine neue Shell. Die Eingabeaufforderung, die Sie sehen, ist die Eingabeaufforderung der erzeugten Shell.
Der normale Anwendungsfall für script ist ungefähr so:
- starte
script. dies spawnt eine neue Shell. - Befehle in der neuen Shell ausführen.
- die Shell verlassen und zur vorherigen Shell wechseln
- Untersuchen Sie die von
scripterstellte Protokolldatei
Also im Grunde script funktioniert wie erwartet. Sie müssen einen anderen Weg finden, um das zu erreichen, was Sie wollen.
Sie können die Ausführung Ihres Skripts wie folgt protokollieren:
#! /bin/bash
exec > logfile 2>&1
set -x
FOO=BAR
echo $FOO
Erklärung:
exec > logfile 2>&1leitet stdout und stderr in die Logdatei umset -xlässt bash jeden Befehl ausgeben, bevor er ausgeführt wird
Beispiel:
$ ./foo.sh
# (no output here because everything goes to logfile)
$ cat logfile
+ FOO=BAR
+ echo BAR
BAR
Der Nachteil dieser Methode ist, dass das Skript keine für Menschen sichtbare Ausgabe ausgibt. Alles geht ins Logfile.
Alternativ können Sie es auch so machen:
#! /bin/bash
# nothing special here
FOO=BAR
echo $FOO
Dann wie folgt ausführen:
$ script -c "bash -x foo.sh"
Script started, file is typescript
+ FOO=BAR
+ echo BAR
BAR
Script done, file is typescript
jetzt ist die Ausgabe direkt sichtbar und wird auch in der Protokolldatei gespeichert (der Standardname der Protokolldatei ist typescript )
$ cat typescript
Script started on Mi 18 Mai 2011 01:05:29 CEST
+ FOO=BAR
+ echo BAR
BAR
Script done on Mi 18 Mai 2011 01:05:29 CEST
Ihr Bash-Skript wird noch ausgeführt, aber es hat eine neue interaktive Shell hervorgebracht. Das Bash-Skript wartet auf script zu vervollständigen, was nur geschieht, wenn die interaktive Shell beendet wird (entweder durch Beenden oder durch Eingabe von exit durch den Benutzer ).
Um den Befehl nach script zu machen von script protokolliert werden , machen Sie es so:
script build_log -c 'echo -e "* This line should appear inside the /"build_log/" log file..."'
Allerdings script wird nach Ausführung dieses Befehls nicht mehr ausgeführt.
Um mehrere Befehle innerhalb von script auszuführen , fügen Sie diese Befehle in ein anderes Bash-Skript ein und geben Sie dieses Bash-Skript als Befehl an, der zu -c ausgeführt werden soll Option.