Câu trả lời:
Có một lệnh được tạo riêng cho trường hợp đó: yes
$ yes | ./script
Những gì nó làm là kết nối đầu ra của yes
đầu vào ./script
. Vì vậy, khi ./script
yêu cầu đầu vào của người dùng, thay vào đó, nó sẽ nhận được đầu ra yes
. Đầu ra của yes
là một dòng vô tận y
theo sau bởi một dòng mới. Vì vậy, về cơ bản như thể người dùng đang nhập y
cho mọi câu hỏi ./script
.
Nếu bạn muốn nói không ( n
) thay vì có ( y
) bạn có thể làm như thế này:
$ yes n | ./script
Lưu ý rằng một số công cụ có một tùy chọn để luôn luôn yes
trả lời. Xem ở đây ví dụ: Bỏ qua lời nhắc có / không trong 'apt-get nâng cấp'
Các phương pháp khác để nhập dữ liệu:
Nếu bạn biết chính xác có bao nhiêu y
kịch bản của bạn đang mong đợi, bạn có thể làm nó như thế này:
$ printf 'y\ny\ny\n' | ./script
Các dòng mới ( \n
) là các phím enter.
Sử dụng printf
thay vì yes
bạn có quyền kiểm soát chi tiết hơn của đầu vào:
$ printf 'yes\nno\nmaybe\n' | ./script
Lưu ý rằng trong một số trường hợp hiếm hoi, lệnh không yêu cầu người dùng nhấn enter sau ký tự. trong trường hợp đó hãy bỏ dòng mới ra:
$ printf 'yyy' | ./script
Để hoàn thiện, bạn cũng có thể sử dụng tài liệu ở đây :
$ ./script << EOF
y
y
y
EOF
Hoặc nếu shell của bạn hỗ trợ nó một chuỗi ở đây :
$ ./script <<< "y
y
y
"
Hoặc bạn có thể tạo một tệp với một đầu vào trên mỗi dòng:
$ ./script < inputfile
Nếu lệnh đủ phức tạp và các phương thức trên không còn đủ thì bạn có thể sử dụng mong đợi .
Dưới đây là một ví dụ về một kịch bản kỳ vọng siêu đơn giản:
spawn ./script
expect "are you sure?"
send "yes\r"
expect "are you really sure?"
send "YES!\r"
expect eof
Kỹ thuật nitpick:
Lệnh gọi giả định mà bạn đưa ra trong câu hỏi của bạn không hoạt động:
$ ./script < echo 'yyyyyyyyyyyyyy'
bash: echo: No such file or directory
Điều này là do ngữ pháp shell cho phép toán tử chuyển hướng ở bất cứ đâu trong dòng lệnh. Về phần vỏ có liên quan đến dòng lệnh giả định của bạn giống như dòng này:
$ ./script 'yyyyyyyyyyyyyy' < echo
bash: echo: No such file or directory
Điều đó có nghĩa là ./script
sẽ được gọi với đối số 'yyyyyyyyyyyyyy'
và stdin sẽ nhận đầu vào từ một tệp có tên echo
. Và bash phàn nàn vì tập tin không tồn tại.
cannot enable tty mode on non tty input
. Bạn có biết một cách giải quyết cho điều đó?
printf
mẹo với một run
tệp mà tôi cần để tự động hóa quá trình cài đặt, tất cả những gì xảy ra là tôi nhận được thông báo lỗi Warning: Tried to connect to session manager, None of the authentication protocols specified are supported
và tập lệnh sẽ mở trong một thiết bị đầu cuối mới và yêu cầu tôi nhập thủ công như bình thường. Điều này đang xảy ra trên Debian bằng cách này. Bất kỳ đề xuất?
Sử dụng lệnh yes
:
yes | script
Trích từ trang người đàn ông:
NAME
yes - output a string repeatedly until killed
SYNOPSIS
yes [STRING]...
yes OPTION
DESCRIPTION
Repeatedly output a line with all specified STRING(s), or 'y'.
Một số thứ ( apt-get
ví dụ) chấp nhận các cờ đặc biệt để chạy ở chế độ im lặng (và chấp nhận mặc định). Trong apt-get
trường hợp của bạn, bạn chỉ cần truyền cho nó một -y
lá cờ. Điều này hoàn toàn phụ thuộc vào kịch bản của bạn mặc dù.
Nếu bạn cần những thứ phức tạp hơn, bạn có thể gói kịch bản của mình trong một kịch bản mong đợi. mong đợi cho phép bạn đọc đầu ra và gửi đầu vào để bạn có thể thực hiện những điều khá phức tạp mà các kịch bản khác không cho phép. Đây là một trong những ví dụ từ trang Wikipedia của nó :
# Assume $remote_server, $my_user_id, $my_password, and $my_command were read in earlier
# in the script.
# Open a telnet session to a remote server, and wait for a username prompt.
spawn telnet $remote_server
expect "username:"
# Send the username, and then wait for a password prompt.
send "$my_user_id\r"
expect "password:"
# Send the password, and then wait for a shell prompt.
send "$my_password\r"
expect "%"
# Send the prebuilt command, and then wait for another shell prompt.
send "$my_command\r"
expect "%"
# Capture the results of the command into a variable. This can be displayed, or written to disk.
set results $expect_out(buffer)
# Exit the telnet session, and wait for a special end-of-file character.
send "exit\r"
expect eof
.sh
kịch bản shell, phải không? Hay là có một cách?
Trong kịch bản shell, bạn cũng có thể sử dụng thủ thuật sinh sản, mong đợi và gửi sau đây
spawn script.sh
expect "Are you sure you want to continue connecting (yes/no)?"
send "yes"
Tuy nhiên, trong scenerio ở trên, bạn sẽ phải đưa ra cụm từ mà bạn đang mong đợi nhận được trong khi bạn thực thi tập lệnh để có thêm ví dụ đi đến liên kết sau
Được rồi, đây có thể không phải là một giải pháp rất thanh lịch nhưng nếu bạn viết các tùy chọn của mình trong một tệp riêng biệt và sau đó chuyển nó làm đầu vào cho tập lệnh, nó cũng sẽ hoạt động. Vì vậy, nếu bạn tạo một tệp mới với tất cả các tùy chọn của mình (gọi tệp này là 'tùy chọn.in'), thì bạn có thể dễ dàng chạy tập lệnh của mình ./script.sh < options.in
và chỉnh sửa / tạo các tệp tùy chọn khác nhau nếu phù hợp.
options.in
tập tin như thế nào? Bạn có thể đưa ra một ví dụ không?
Bạn có thể cung cấp đầu vào của người dùng cho tập lệnh của mình cat
, từ tệp văn bản, được chuyển sang tập lệnh của bạn bash
như sau:
cat input.txt | bash your_script.sh
Chỉ cần đặt đầu vào người dùng mong muốn của bạn vào tệp input.txt của bạn, bất kỳ câu trả lời nào bạn muốn - y, n, chữ số, chuỗi, v.v.
-f
tùy chọn hoạt động tốt với các lệnh nhất định.