2012-02-18 41 views

Trả lời

21

Bạn sẽ có thể sử dụng công tắc -t thử nghiệm để biết được các dòng đầu ra là tty s hay không:

if [ -t 1 ] ; then 
    echo stdout is a terminal 
else 
    echo stdout is not a terminal 
fi 

Sử dụng -t 0 cho stdin.

Sử dụng -t 2 cho stderr.

+0

nó hoạt động như tôi mong muốn! Cảm ơn rất nhiều – Sigmun

25

Về mặt kỹ thuật không có cách nào để nói liệu stdin/stdout/stderr có được "chuyển hướng" hay không bởi vì bạn không biết điều gì đang gọi tập lệnh của bạn. Nếu nó không được gọi từ một trình bao khác, thì không có khái niệm "chuyển hướng".

Tất cả những gì bạn phải tiếp tục là loại mô tả tập tin vào/ra/err là gì (terminal, fifo, pipe, device, file etc). Thông thường, bạn chỉ muốn phát hiện xem đầu ra của bạn có đi đến màn hình của người dùng hay không hoặc liệu nó có đi đến tiến trình khác hay không. Trong trường hợp này sử dụng [ -t 1 ] theo câu trả lời của Mat.

Nếu bạn muốn tìm hiểu xem quy trình của bạn đã được chuyển hướng đến đâu, hãy kiểm tra mục tiêu của các liên kết tượng trưng /proc/$$/fd/1/proc/$$/fd/2.

Lưu ý rằng ai đó có thể kết nối đầu ra của quy trình của bạn với một thiết bị đầu cuối khác với ./myscript.sh > /dev/pts/1234. Sau đó, nó sẽ được "chuyển hướng", nhưng stdout vẫn sẽ là một thiết bị đầu cuối.

Ví dụ:

$ ls -l /proc/$$/fd/1 > results 
$ bash -c 'ls -l /proc/$$/fd/1 >>results' > /dev/null 
$ bash -c 'ls -l /proc/$$/fd/1 >>results' |cat 
$ bash -c 'ls -l /proc/$$/fd/1 >>results' > /dev/pts/0 
$ cat results 
lrwx------ 1 je4d je4d 64 2012-02-17 21:09 /proc/2463/fd/1 -> /dev/pts/11 
l-wx------ 1 je4d je4d 64 2012-02-18 13:17 /proc/8302/fd/1 -> /dev/null 
l-wx------ 1 je4d je4d 64 2012-02-18 13:17 /proc/8304/fd/1 -> pipe:[222798] 
l-wx------ 1 je4d je4d 64 2012-02-18 13:17 /proc/8307/fd/1 -> /dev/pts/0 

[ -t 1 ] sẽ là đúng đối với 1 và thứ 4 trong những người.

+2

Đây là câu trả lời phong phú cho phép tôi hiểu một số nội dung bash. Cảm ơn ! – Sigmun

+0

Thx! Tôi đã làm một thử nghiệm dòng lệnh, nhưng nó không làm việc cho sự ngạc nhiên của tôi. Lệnh này: '(lsof -p $$; ls -l/proc/$$/fd; [-t 1] || echo -n KHÔNG \; echo TERM: $$; ps --forest -s $$;) | cat -' in '/ dev/pts/1' cho fd 1, nhưng in' NOT TERM'. Vì vậy, [tag: bash] biết rằng nó được chuyển hướng ('(...)' chạy trong thẻ phụ [bash]), nhưng $$ vẫn là PID của thẻ [tag: bash] gốc. – TrueY

+0

Vâng, đó chỉ là những gì $$ làm, subshells không ảnh hưởng đến nó. Đó là lý do tại sao tôi sử dụng bash -c '...' để thay thế. – je4d

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