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
và /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.
nó hoạt động như tôi mong muốn! Cảm ơn rất nhiều – Sigmun