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?
tail -f /var/tmp/logfile.39918
sehe ich alles, was ich in das alte Fenster tippe. Cleverer Trick!