2012-02-23 31 views
7

Tôi có hai tập lệnh shell, một tập lệnh đóng vai trò là "chương trình" chính và một tập lệnh khác đóng vai trò là "thư viện".Ghi vào thiết bị đầu cuối sau khi chuyển hướng stdout sang một tệp mà không sử dụng stderr?

Ở một số nơi trong "chương trình", tôi sẽ làm một việc như: log "$thing" >> "$logfile", trong đó log là một hàm được xác định trong "thư viện".

# program.sh 

logfile="log.txt" 
stuff="hahah heheh hoho" 

. library.sh 

for thing in $stuff; do 
    log "$thing" >> "$logfile" 
done 

Câu hỏi của tôi: Có cách nào để chuyển hướng một số của đầu ra từ các chức năng trở lại nhà ga mà không sử dụng stderr?

# library.sh 

log() { 

    # This gets written to the log 
    echo "`date --rfc-3339=seconds`: $1" 

    # How to write this to the terminal *without* using stderr? 
    echo "Info: Message written to log." >&2 

} 

Tôi muốn tránh việc sử dụng các stderr bởi vì trong chương trình thực tế của tôi, có một tùy chọn để chuyển hướng lỗi vào một tập tin, nhưng những thông điệp tôi muốn gửi đến các thiết bị đầu cuối là cung cấp thông tin, không sai sót, và nên luôn hiển thị trên thiết bị đầu cuối.

Trả lời

12

Mở /dev/tty trên FD khác.

exec 0< /dev/null 
exec 1> /dev/null 
exec 2> /dev/null 
exec 3> /dev/tty 
echo 'Hello, World!' >&3 
+0

thú vị ... có thể giúp bạn giải thích những gì đang xảy ra ? Ngoài ra, điểm của ba dòng đầu tiên là gì? Có vẻ như nó chỉ hoạt động tốt với hai người cuối cùng. Và, tôi cho rằng tôi nên đặt dòng thứ tư trong 'program.sh' thay vì thực hiện nó mỗi khi' log' được gọi? –

+1

Ba dòng đầu tiên chỉ chứng minh rằng các mô tả ban đầu hiện nay vô dụng. Đó là một cách dễ dàng cho một chương trình phức tạp hơn. – sarnold

+0

Ba đầu tiên là để cho thấy rằng kịch bản không có bất kỳ cách nào khác để nói chuyện với bên ngoài (ví dụ như đang bận làm những việc khác). Tôi muốn đặt dòng 'exec' trong thư viện.sh, nhưng cho nó một số cao hơn (nói, 8 hoặc hơn) chỉ trong trường hợp. –

8

Bạn có thể viết trực tiếp đến /dev/tty mỗi khi bạn muốn ghi vào thiết bị đầu cuối:

echo "hello world" > /dev/tty 

Đối với một ví dụ nhỏ:

$ cat writer.sh 
#!/bin/sh 

echo "standard output" 
echo "standard error" >&2 

echo "direct to terminal" > /dev/tty 
$ ./writer.sh > /tmp/out 2> /tmp/err 
direct to terminal 
$ cat /tmp/out 
standard output 
$ cat /tmp/err 
standard error 
$ 
+0

Cảm ơn vì điều này. Tôi muốn đánh dấu cả hai điều này đúng, nhưng tôi phải đưa cái này cho Ignacio cho nước sốt đặc biệt 'exec' :) –

+0

Nước sốt đặc biệt' exec' _is_ gọn gàng. :) – sarnold

Các vấn đề liên quan