2014-04-12 19 views
5

Tôi xin lỗi trước - Tôi không hiểu đầy đủ ý tưởng đằng sau những gì tôi yêu cầu đủ để hiểu tại sao nó không hoạt động (Tôi không biết những gì tôi cần phải học). Trước tiên, tôi đã tìm kiếm sự trao đổi xếp chồng để tìm câu trả lời - tôi đã tìm thấy một số thông tin có vẻ liên quan, nhưng không giải thích được các khái niệm đủ rõ ràng để tôi hiểu cách xây dựng một giải pháp làm việc. Tôi đã được cọ rửa google nhưng không tìm thấy bất kỳ thông tin nào mô tả chính xác những gì đang diễn ra theo cách mà tôi hiểu. Bất kỳ hướng nào đến các khái niệm nền có thể giúp tôi hiểu những gì đang xảy ra sẽ được đánh giá cao.Sử dụng đọc -p trong tập lệnh bash được thực thi từ ống

Có thể nhận dữ liệu nhập của người dùng trong tập lệnh bash được thực thi từ đường ống không?

Ví dụ:

wget -q -O - http://myscript.sh | bash 

Và trong kịch bản:

read -p "Do some action (y/n): " __response 
if [[ "$__response" =~ ^[Yy]$ ]]; then 
    echo "Performing some action ..." 
fi 

Theo tôi được biết, điều này không làm việc vì đọc những nỗ lực để đọc các đầu vào từ stdin và kịch bản bash hiện đang "thực hiện thông qua đường ống đó" (tôi chắc chắn có một cách chính xác hơn về kỹ thuật để mô tả những gì đang xảy ra, nhưng tôi không biết làm thế nào).

Tôi tìm thấy một giải pháp mà đề nghị sử dụng:

read -t 1 __response </dev/tty 

Tuy nhiên, điều này không làm việc, hoặc.

Mọi ánh sáng đều xuất hiện trên các khái niệm tôi cần hiểu để thực hiện công việc này hoặc giải thích lý do tại sao nó không hoạt động hoặc giải pháp sẽ được đánh giá cao.

Trả lời

3

Giải pháp tty hoạt động. Thử nghiệm nó với mã này, ví dụ:

$ date | { read -p "Echo date? " r </dev/tty ; [ "$r" = "y" ] && cat || echo OK ; } 
Echo date? y 
Sat Apr 12 10:51:16 PDT 2014 
$ date | { read -p "Echo date? " r </dev/tty ; [ "$r" = "y" ] && cat || echo OK ; } 
Echo date? n 
OK 

Dấu nhắc từ read xuất hiện trên thiết bị đầu cuối và read chờ đợi một phản ứng trước khi quyết định để echo ngày hay không.

Những gì tôi đã viết ở trên khác với dòng dưới đây trong hai khía cạnh quan trọng:

read -t 1 __response </dev/tty 

Thứ nhất, lựa chọn -t 1 cho read một thời gian chờ của một giây. Thứ hai, lệnh này không cung cấp lời nhắc. Sự kết hợp của hai điều này có thể có nghĩa là, mặc dù readngắn gọn yêu cầu đầu vào, bạn không biết điều đó.

+0

Cảm ơn bạn. Hoạt động hoàn hảo. – nfarrar

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