kiểm tra tiếng vang | stty -echo -> stty: đầu vào tiêu chuẩn: ioctl không phù hợp cho thiết bị


9

Tôi đã chơi với một tập lệnh perl lấy đầu vào của người dùng như sau:

system( qw( stty -echo ) );
$? == 0 or die "Error unable to disable character printing.\n";
print "$prompt: ";
my $input = <STDIN>;

Tôi nghĩ rằng tôi sẽ có thể xử lý phản hồi bằng cách sử dụng echo tuy nhiên nó có vẻ mâu thuẫn với lệnh stech -echo và tạo ra lỗi sau:

stty: standard input: Inappropriate ioctl for device

Nếu không thay đổi tập lệnh perl, điều gì có thể được thực hiện trong bash để chuyển vào đầu vào? Điều gì gây ra vấn đề?


thay vì perl sử dụng trình thông dịch dự kiến: chẳng hạn như: thegeek ware.com/2010/10/Exect-examples
tiếng Ba Tư

Ví dụ perl có thể không làm nổi bật vấn đề. Lỗi cơ bản phát sinh từ chuỗi này: kiểm tra tiếng vang | stty -echo;
dùng2219808

Câu trả lời:


5

stty -echothay đổi cài đặt trên bộ mô tả tập tin đầu vào. Nếu bạn đang đặt một cái gì đó vào lệnh stty, thì bộ mô tả tệp đầu vào là đường ống và stty trên một đường ống là, eh, không phù hợp (như thông báo lỗi nói).

Không rõ những gì bạn đang cố gắng để đạt được. Nếu bạn muốn gửi văn bản testđến tập lệnh perl của bạn để được đọc trong my $input = <STDIN>;dòng, sau đó chỉ cần loại bỏ các công cụ stty.

Nếu bạn cũng muốn đọc văn bản dưới dạng đầu vào của người dùng (tức là nhập vào) và trong khi thực hiện điều đó ngăn văn bản bị lặp lại (ví dụ: mật khẩu), hãy kiểm tra xem đầu vào tiêu chuẩn có phải là tty (thiết bị đầu cuối) hay không trước khi thực hiện stty:

system( qw( stty -echo ) ) if -t 0;

Điều đó nói rằng, đừng bỏ ra cho tất cả các loại, đó không phải là những gì perl dành cho (nếu không bạn cũng có thể viết toàn bộ trong vỏ). Bạn có thể thay đổi cài đặt stty từ bên trong perl, google là bạn của bạn.


Đó không phải là kịch bản của tôi nên tôi đang tìm cách để vượt qua đầu vào và tự động hóa nó mà không thay đổi nó. Mong đợi có lẽ là giải pháp, tôi nghĩ có thể có một cách khác để dẫn mọi thứ vào.
user2219808

system( qw( stty -echo < /dev/tty) );là một cách giải quyết có thể, nhưng tập lệnh cần khôi phục lại tiếng vang sau đó. Sử dụng kỳ vọng có thể là một phù hợp tốt hơn.
Henk Langeveld

2

sttykết nối với thiết bị đầu cuối trên đầu vào tiêu chuẩn của nó. Bạn cần chạy tập lệnh Perl với đầu vào tiêu chuẩn được kết nối với thiết bị đầu cuối mà bạn muốn hành động. Nếu chính tập lệnh Perl được gọi từ một phạm vi nơi đầu vào tiêu chuẩn được chuyển hướng đến một thứ khác ngoài thiết bị đầu cuối, bạn có thể sử dụng /dev/ttyđể tham khảo thiết bị đầu cuối kiểm soát của quy trình:

that_perl_script </dev/tty

Nếu bạn muốn có thể chuyển đầu vào cho tập lệnh và bạn không quan tâm đến tập lệnh làm gì với cài đặt đầu cuối, bạn có thể sử dụng mong đợi . Sử dụng mong đợi để cung cấp mật khẩu cho một lệnh yêu cầu một thiết bị đầu cuối là phổ biến.

Nếu tập lệnh Perl chỉ truy cập vào thiết bị đầu cuối bằng cách gọi sttylệnh, một cách tiếp cận khác sẽ là cung cấp một sttylệnh giả .

mkdir dummy-stty
echo '#!/bin/sh' >dummy-stty/stty
chmod a+rx dummy-stty/stty
echo swordfish | PATH=$PWD/dummy-stty:$PATH that_perl_script
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.