Tôi đang chuyển một tập lệnh ksh cũ sang shell Bourne. Kịch bản ksh cũ chứa mã sau:
#!/bin/sh
tmpLog=/var/tmp/logfile.$$
exec 1> $tmpLog
exec 2>&1
eval $*
another_command_1
another_command_2
Từ những gì tôi đọc được, có vẻ như hai câu lệnh exec này được dùng để thực thi $ *, Another_command_1, Another_command_2 và tất cả các lệnh sau; và sau đó chuyển hướng tất cả STDERR và STDOUT từ các lệnh đó vào /var/tmp/logfile.$$
. Tuy nhiên, khi tôi chạy nó trong một kịch bản thì kịch bản thất bại sau đó 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:~ $
Và khi tôi chạy nó trên dòng lệnh, shell của tôi đóng băng sau khi tôi thực thi exec 2>&1
:
stefanl@host:~ $ tmpLog=/var/tmp/logfile.$$
stefanl@host:~ $ exec 1> $tmpLog
stefanl@host:~ $ exec 2>&1
### FREEZE ###
Những câu hỏi của tôi:
- Phải
exec 2>&1
làm gì đây? - Tại sao nó thất bại cho tôi?
tail -f /var/tmp/logfile.39918
tôi sẽ thấy mọi thứ tôi gõ trong cửa sổ cũ. Khéo léo thông minh!