Có lời nhắc tương tác câu trả lời kịch bản bash [trùng lặp]


109

Có thể có một tập lệnh bash tự động xử lý các lời nhắc thường được hiển thị cho người dùng với các hành động mặc định không? Hiện tại, tôi đang sử dụng một tập lệnh bash để gọi một công cụ nội bộ sẽ hiển thị lời nhắc cho người dùng (nhắc Y / N) để hoàn thành các hành động, tuy nhiên, tập lệnh tôi đang viết cần phải hoàn toàn "thực hành", vì vậy Tôi cần một cách để gửi Y|Nđến lời nhắc để cho phép chương trình tiếp tục thực thi. Điều này có khả thi không?


đây không phải là "gợi" ... như @unwind nói, đó là "tự động"
benzaita

3
Ví dụ về cách sử dụng yesđể thực hiện việc này: unix.stackexchange.com/questions/47344/…
Droogans 22/09/2016

Câu trả lời:


65

Đây không phải là "tự động hoàn thành", đây là tự động hóa. Một công cụ phổ biến cho những điều này được gọi là Kỳ vọng .

Bạn cũng có thể thoát khỏi chỉ với đầu vào đường ống từ yes.


3
Thật không may, tôi không thể sử dụng kỳ vọng vì chúng yêu cầu nghiêm ngặt về không gian trên hệ thống chạy điều này nên tôi không thể thêm các gói bổ sung, nhưng việc đưa yesvào đã thực hiện thủ thuật, may mắn thay, tất cả các lời nhắc chỉ yêu cầu chữ 'y'. Cảm ơn.
TJ L

Tuy nhiên Yes | commandcó thể không hoạt động luôn luôn. Nếu nó chỉ dành cho mục đích cài đặt thì tôi đã sử dụng -ylà một lựa chọn tốt hơn và ưa thích.
Umesh Kaushik

169

Một đơn giản

echo "Y Y N N Y N Y Y N" | ./your_script

Điều này cho phép bạn chuyển bất kỳ chuỗi "Y" hoặc "N" nào vào tập lệnh của mình.


3
Nếu tôi cần gửi bất kỳ Ncủa nào , tôi đã sử dụng phương pháp này, nhưng tôi chỉ cần Y nên tôi đã đi cùng yes. Thật tệ là tôi không thể chấp nhận hai câu trả lời, vì cả hai đều đúng.
TJ L

3
;) Vâng, nếu bạn cần gửi một số, Nbây giờ bạn có một cách tốt để làm điều đó.
Loïc Février

2
Điều này không hiệu quả với tôi; dấu cách không được tính là dòng mới --- nếu ví dụ tôi lặp lại "Y N" thì nó đưa chuỗi "Y N"làm đầu vào cho lời nhắc đầu tiên và treo ở lời nhắc thứ hai chờ tôi hoàn thành. Tôi đã thử thay đổi khoảng trắng thành dòng mới nhưng điều đó cũng không hoạt động, vẫn đưa ra một chuỗi ký tự cho lời nhắc.
temporary_user_name

52
thử sử dụng printf 'y\ny\ny\n' | ./your_script. Bằng cách này, bạn đang chèn thủ công dòng mới cho mỗi mục nhập dự kiến.
Majid

8
printf '%s\n' Y Y N N Y N Y Y Nđặt dòng mới giữa các mục, nhưng không cần một chuỗi định dạng lớn.
Charles Duffy

16

Tôi thấy cách tốt nhất để gửi thông tin đầu vào là sử dụng cat và tệp văn bản để chuyển bất kỳ thông tin đầu vào nào bạn cần.

cat "input.txt" | ./Script.sh

Mong đợi đã không hoạt động như mong đợi đối với tôi. Đây là câu trả lời đơn giản và tốt nhất cho câu hỏi này.
cloudxix

12

Nếu bạn chỉ có Y để gửi:

$> yes Y |./your_script

Nếu bạn chỉ có N để gửi:

$> yes N |./your_script

9

Trong tình huống của tôi, tôi cần trả lời một số câu hỏi không có Y hoặc N nhưng với văn bản hoặc để trống. Tôi tìm thấy cách tốt nhất để làm điều này trong tình huống của tôi là tạo một tệp shellcript. Trong trường hợp của tôi, tôi gọi nó là autocomplete.sh

Tôi cần trả lời một số câu hỏi cho một nhà xuất lược đồ học thuyết nên tệp của tôi trông như thế này.

- Đây chỉ là một ví dụ -

php vendor/bin/mysql-workbench-schema-export mysqlworkbenchfile.mwb ./doctrine << EOF
`#Export to Doctrine Annotation Format`                                     1
`#Would you like to change the setup configuration before exporting`        y
`#Log to console`                                                           y
`#Log file`                                                                 testing.log
`#Filename [%entity%.%extension%]`
`#Indentation [4]`
`#Use tabs [no]`
`#Eol delimeter (win, unix) [win]`
`#Backup existing file [yes]`
`#Add generator info as comment [yes]`
`#Skip plural name checking [no]`
`#Use logged storage [no]`
`#Sort tables and views [yes]`
`#Export only table categorized []`
`#Enhance many to many detection [yes]`
`#Skip many to many tables [yes]`
`#Bundle namespace []`
`#Entity namespace []`
`#Repository namespace []`
`#Use automatic repository [yes]`
`#Skip column with relation [no]`
`#Related var name format [%name%%related%]`
`#Nullable attribute (auto, always) [auto]`
`#Generated value strategy (auto, identity, sequence, table, none) [auto]`
`#Default cascade (persist, remove, detach, merge, all, refresh, ) [no]`
`#Use annotation prefix [ORM\]`
`#Skip getter and setter [no]`
`#Generate entity serialization [yes]`
`#Generate extendable entity [no]`                                          y
`#Quote identifier strategy (auto, always, none) [auto]`
`#Extends class []`
`#Property typehint [no]`
EOF

Điều tôi thích ở chiến lược này là bạn có thể nhận xét câu trả lời của bạn là gì và sử dụng EOF một dòng trống chỉ đó là (câu trả lời mặc định). Hóa ra công cụ xuất khẩu này có đối tác JSON của riêng nó để trả lời những câu hỏi này, nhưng tôi đã tìm ra điều đó sau khi tôi làm điều này =).

để chạy script chỉ cần ở trong thư mục bạn muốn và chạy 'sh autocomplete.sh'trong terminal.

Tóm lại, bằng cách sử dụng << EOL & EOF kết hợp với Return Lines, bạn có thể trả lời từng câu hỏi của lời nhắc nếu cần. Mỗi dòng mới là một câu trả lời mới.

Ví dụ của tôi chỉ cho thấy cách này có thể được thực hiện với các nhận xét cũng sử dụng ký tự `để bạn nhớ từng bước là gì.

Lưu ý ưu điểm khác của phương pháp này là bạn có thể trả lời với nhiều hơn sau đó chỉ cần Y hoặc N ... trên thực tế, bạn có thể trả lời với khoảng trống!

Mong rằng nó giúp ai đó thoát.


4

Có một ứng dụng tích hợp đặc biệt cho điều này - ' '.

Để trả lời tất cả các câu hỏi với cùng một câu trả lời, bạn có thể chạy

yes [answer] |./your_script

Hoặc bạn có thể đặt nó bên trong kịch bản của bạn để có câu trả lời cụ thể cho từng câu hỏi


làm thế nào tôi có thể làm điều đó bên trong script? ý tôi là chỉ định các câu trả lời khác nhau cho mỗi câu hỏi
Sengo
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.