Tôi giả định rằng chương trình sẽ gọi hàm glibc isatty()
để kiểm tra xem stdout có phải là thiết bị đầu cuối hay không. Đó là điều phổ biến đối với các chương trình sử dụng đầu ra được tô màu trên các đầu cuối hoặc các tính năng khác của thiết bị đầu cuối ANSI như định vị con trỏ hoặc xóa/vẽ lại đường.
Bạn có thể đánh lừa chương trình bằng biến môi trường LD_PRELOAD. LD_PRELOAD được liên kết ELF xử lý và cho biết rằng thư viện động phải được tải trước tất cả những thứ khác. Sử dụng tính năng này, bạn có thể ghi đè các hàm thư viện, trong trường hợp của bạn là hàm glibc isatty()
. Bạn có thể làm theo ví dụ này article.
tôi đã chuẩn bị một ví dụ cho bạn:
Đầu tiên tạo ra các tập tin libisatty.c:
/**
* Overrides the glibc function. Will always return true.
*
* Note: Although this should be ok for most applications it can
* lead to unwanted side effects. It depends on the question
* why the programm calls isatty()
*/
int isatty(int param) {
return 1;
}
và biên dịch nó như là một lib chia sẻ:
gcc -shared -o libisatty.so libisatty.c
Nó nên xây dựng tốt.
Bây giờ là lúc để kiểm tra thư viện. :) Tôi đã sử dụng lệnh ls --color=auto
để kiểm tra. ls
gọi isatty()
để quyết định xem có nên tô màu đầu ra của nó hay không. Nếu đầu ra được chuyển hướng đến một tập tin hoặc một đường ống thì nó sẽ không được tô màu. Bạn có thể kiểm tra điều này một cách dễ dàng bằng cách sử dụng lệnh sau:
ls --color=auto # should give you colorized output
ls --color=auto | cat # will give you monochrome output
Bây giờ chúng ta sẽ cố gắng lệnh thứ hai một lần nữa bằng cách sử dụng var môi trường LD_PRELOAD:
LD_PRELOAD=./libisatty.so ls --color=auto | cat
Bạn sẽ thấy đầu ra colorized.
usename btw mát: uʍop ǝpısdn !!: D
Tôi đã nghe ' expect' là một chương trình tốt để làm điều đó – BeniBela
Cũng kiểm tra chương trình 'script' cho mục đích đó: http://stackoverflow.com/a/1402389/516188 –