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
script
erstellte 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>&1
leitet stdout und stderr in die Logdatei umset -x
lä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.