Ich portiere ein altes ksh-Skript auf die Bourne-Shell. Das alte ksh-Skript enthält den folgenden Code:
#!/bin/sh
tmpLog=/var/tmp/logfile.$$
exec 1> $tmpLog
exec 2>&1
eval $*
another_command_1
another_command_2
Nach dem, was ich gelesen habe, sollen diese beiden exec-Anweisungen $ *, einen anderen_Befehl_1, einen anderen_Befehl_2 und alle folgenden Befehle ausführen. und leiten Sie dann alle STDERR und STDOUT von diesen Befehlen nach um /var/tmp/logfile.$$
. Wenn ich dies jedoch in einem Skript ausführe, schlägt das Skript danach fehl exec 2>&1
.
stefanl@host:~ $ sh -xv ./output.sh echo "Hello"
#!/bin/sh
tmpLog=/var/tmp/logfile.$$
+ tmpLog=/var/tmp/logfile.39918
exec 1> $tmpLog
+ exec
exec 2>&1
+ exec
stefanl@host:~ $
Und wenn ich dies über die Befehlszeile ausführe, friert meine Shell ein, nachdem ich Folgendes ausgeführt habe exec 2>&1
:
stefanl@host:~ $ tmpLog=/var/tmp/logfile.$$
stefanl@host:~ $ exec 1> $tmpLog
stefanl@host:~ $ exec 2>&1
### FREEZE ###
Meine Fragen:
- Was
exec 2>&1
soll tun? - Warum scheitert es für mich?
quelle
tail -f /var/tmp/logfile.39918
sehe ich alles, was ich in das alte Fenster tippe. Cleverer Trick!logfile
, ..." sollte "Standardausgabe und Standardfehler " sein . Ich werde bearbeiten, um die Korrektur vorzunehmen.Diese Form von exec (dh ohne Befehl) wird verwendet, um alle nachfolgenden Ausgaben des aktuellen Shell-Interpreters umzuleiten.
von Bashs eingebauter Hilfe:
Ich verwende
exec &> logfile
, um stdout und stderr gleichzeitig umzuleiten. ZB beginnen die meisten meiner Backup- und Rsync-Wrapper-Skripte (oder jedes Skript, das viele Ausgaben erzeugt, die ich später genauer untersuchen möchte) mit etwa dem folgenden:Ich führe das Skript dann von cron oder im Hintergrund aus und verwende es
tail -F
, um die Protokolldatei zu beobachten, während das Skript ausgeführt wird. Mit dem Savelog kann ich die Ausgabe der letzten 7 Läufe beibehalten (standardmäßig 7,savelog -c
um dies zu ändern).quelle
&>
Operator noch ist das Zitieren derbash
Manpage fürchterlich hilfreich. Der Teil über Cron ist irrelevant.exec 2>&1
tut? Ich stimme Antworten, die explizit oder implizit zu Missverständnissen führen (in Ihrem Fall impliziertsh
=bash
), generell ab , weil nicht jede Person, die Ihre Antwort in Zukunft liest, den Unterschied kennt. bash basiert auf sh, aber in der Praxis gibt es viele Unterschiede (wie das&>
: Wenn man das in ein Bourne-Shell-Skript einfügt, wird es wahrscheinlich kaputt gehen). Außerdem istbash
exec
wahrscheinlich keine der akzeptierten Optionen gültig.