2012-01-06 11 views
18

Tôi có một tập lệnh bash mà tôi muốn im lặng khi chạy mà không có tty đính kèm (như từ cron). Tôi hiện đang tìm cách chuyển hướng đầu ra thành/dev/null theo một cách có điều kiện. Đây là một ví dụ về những gì tôi đã có trong tâm trí, nhưng tôi sẽ có nhiều lệnh hơn là làm ra trong kịch bảnchuyển hướng có điều kiện trong bash

#!/bin/bash 
# conditional-redirect.sh 
if tty -s; then 
    REDIRECT= 
else 
    REDIRECT=">& /dev/null" 
fi 
echo "is this visible?" $REDIRECT 

Thật không may, điều này không làm việc:

$ ./conditional-redirect.sh 
is this visible? 
$ echo "" | ./conditional-redirect.sh 
is this visible? >& /dev/null 

những gì tôi don' t muốn làm là sao chép tất cả các lệnh trong một với-chuyển hướng hoặc với-no-chuyển hướng biến thể:

if tty -s; then 
    echo "is this visible?" 
else 
    echo "is this visible?" >& /dev/null 
fi 

EDIT:

Sẽ là tuyệt vời nếu giải pháp sẽ cung cấp cho tôi cách để xuất ra nội dung nào đó ở chế độ "yên tĩnh", ví dụ: khi một cái gì đó thực sự sai, tôi có thể muốn nhận được thông báo từ cron.

Trả lời

20

Đối bash, bạn có thể sử dụng dòng:

exec &>/dev/null 

này sẽ trực tiếp tất cảstdoutstderr để /dev/null từ thời điểm đó. Nó sử dụng phiên bản không đối số của exec.

Thông thường, một cái gì đó như exec xyzzy sẽ thay thế chương trình trong quy trình hiện tại bằng chương trình mới nhưng bạn có thể sử dụng phiên bản không đối số này để sửa đổi chuyển hướng trong khi vẫn giữ chương trình hiện tại.

Vì vậy, trong trường hợp cụ thể của bạn, bạn có thể sử dụng một cái gì đó như:

tty -s 
if [[ $? -eq 1 ]] ; then 
    exec &>/dev/null 
fi 

Nếu bạn muốn phần lớn sản lượng được bỏ đi nhưng vẫn muốn ra một số công cụ, bạn có thể tạo ra một xử lý tập tin mới để làm việc đó đi. Một cái gì đó như:

tty -s 
if [[ $? -eq 1 ]] ; then 
    exec 3>&1 &>/dev/null 
else 
    exec 3>&1 
fi 
echo Normal    # won't see this. 
echo Failure >&3   # will see this. 
+1

Vâng, đó là các công trình ! (Hoặc thậm chí đơn giản hơn 'exec &>/dev/null') –

+0

.. nhưng nó có nhược điểm là tất cả đầu ra bị mất trong chế độ" yên tĩnh "; có thể có những tình huống mà tôi thực sự muốn tạo ra thứ gì đó, ngay cả trong chế độ xếp hàng; xem câu hỏi được nâng cấp. –

+0

Điểm tốt, @daniel, tôi nhận được một chút dài trong răng và thói quen cũ chết cứng nhưng tôi đã cập nhật câu trả lời bằng cách sử dụng ưa thích của bạn. – paxdiablo

2

tôi tìm thấy một giải pháp khác, nhưng tôi cảm thấy đó là vụng về, so với paxdiablo của answer:

if tty -s; then 
    REDIRECT=/dev/tty 
else 
    REDIRECT=/dev/null 
fi 
echo "Normal output" &> $REDIRECT 
+2

Điều đó sẽ hoạt động nhưng chỉ khi đầu ra không được chuyển hướng. '/ dev/tty' luôn đề cập đến thiết bị đầu cuối của bạn vì vậy, nếu bạn đã chạy tập lệnh của mình bằng' myscript> xyzzy.log', kết quả bạn gửi đến '/ dev/tty' sẽ không kết thúc trong tệp nhật ký đó . Điều đó có thể không quan trọng mặc dù nó phụ thuộc vào cách bạn muốn sử dụng chương trình của bạn. – paxdiablo

1

Bạn có thể sử dụng một chức năng:

function the_code { 
    echo "is this visible?" 
    # as many code lines as you want 
} 

if tty -s; then # or other condition 
    the_code 
else 
    the_code >& /dev/null 
fi