ฉันจะเขียนสคริปต์การตอบสนอง“ ใช่” สำหรับการติดตั้งโปรแกรมได้อย่างไร?


116

ฉันทำงานกับอินสแตนซ์ Amazon Linux และฉันมีสคริปต์สองสามตัวในการเติมข้อมูลและติดตั้งโปรแกรมทั้งหมดที่ฉันทำงานด้วย แต่มีสองโปรแกรมถามว่า:

Do you want to continue [Y/n]?

และหยุดการติดตั้งชั่วคราว ฉันต้องการตอบ "Y" โดยอัตโนมัติในทุกกรณีตอนนี้ฉันแน่ใจแล้วว่าจะทำอย่างไร


3
ตัวจัดการแพ็คเกจอาจมี--nopromptหรือ--noconfirmตั้งค่าสถานะที่คุณสามารถใช้ได้
Blender

คำตอบ:


210

คำสั่ง 'ใช่'จะก้อง 'Y' (หรือสิ่งที่คุณขอให้) ไปเรื่อย ๆ ใช้เป็น:

yes | command-that-asks-for-input

หรือหากต้องการตัวพิมพ์ใหญ่ "Y":

yes Y | command-that-asks-for-input

สิ่งนี้ใช้ได้กับบางคำสั่งที่รองรับการใช้อินพุตจากใช่หรือไม่? ฉันลองดูจาก OpenStack แล้วก็ไม่ได้ผลฉันคิดว่า Expect นั้นแม่นยำกว่าสำหรับทุกสถานการณ์
HVNSweeting

1
//, ถ้าคุณต้องใส่เต็มคำว่า "ใช่"?
Nathan Basanese

1
โปรดใช้ความระมัดระวังyesเนื่องจากเป็นที่ทราบกันดีว่าจะต้องใช้ CPU ให้สูงสุด stackoverflow.com/a/18164007/720665
David Salamon

ดี. สิ่งนี้ทำให้ชีวิตของฉันง่ายขึ้นมาก : ง. นอกจากนี้ googling -yสำหรับ bash scripts ก็ยาก
Nathan Smith

1
@DavidSalamon เป็นเพียงกรณีที่เขียนถึงบางสิ่งโดยไม่ จำกัด เช่น/dev/nullหรือ STDOUT ไพพ์ไปยังคำสั่งมันจะเขียนเพียงหนึ่งบรรทัดไปยังไพพ์ในแต่ละครั้งที่คำสั่งรับอ่านหนึ่งคำสั่งและจะรอเป็นอย่างอื่น
Walf

69

echo y | command ควรทำงาน.

นอกจากนี้โปรแกรมติดตั้งบางตัวมีการตั้งค่าสถานะ "ใช่อัตโนมัติ" มัน-yสำหรับapt-getบน Ubuntu


ฉันพยายามทำ echo "giturl no" | jspm Registry สร้าง Registry_name jspm-git ในเชลล์สคริปต์ของฉัน แต่ก็ยังคงล้มเหลว ขณะเข้าสู่ giurl ความคิดใด ๆ ?
manismku

อีกตัวอย่างหนึ่ง: ในนักเทียบท่า-เขียนมี-f( --force) ธงซึ่งทำงานเป็น "อัตโนมัติใช่" สำหรับคำสั่งว่าสิ่งที่ลบ
ลุค

คุณจะ "สะท้อน Y" ซ้ำได้อย่างไรในกรณีที่ข้อความแจ้งขอการยืนยันมากกว่าหนึ่งครั้ง
Safak Ozkan

18

คุณอาจไม่มีความสามารถในการติดตั้ง Expect บนเซิร์ฟเวอร์เป้าหมาย มักเป็นกรณีนี้เมื่อคนเขียนพูดว่าเป็นงานของเจนกินส์

ถ้าเป็นเช่นนั้นฉันจะพิจารณาคำตอบต่อไปนี้ใน askubuntu.com:

/ubuntu/338857/automatically-enter-input-in-command-line

printf 'y\nyes\nno\nmaybe\n' | ./script_that_needs_user_input

โปรดสังเกตว่าในบางกรณีที่เกิดขึ้นไม่บ่อยคำสั่งไม่ต้องการให้ผู้ใช้กด Enter หลังอักขระ ในกรณีนั้นปล่อยให้บรรทัดใหม่ออก:

printf 'yyy' | ./script_that_needs_user_input

เพื่อความสมบูรณ์คุณสามารถใช้เอกสารที่นี่:

./script_that_needs_user_input << EOF
y
y
y
EOF

หรือถ้าเชลล์ของคุณรองรับสตริงที่นี่:

./script <<< "y
y
y
"

หรือคุณสามารถสร้างไฟล์ที่มีหนึ่งอินพุตต่อบรรทัด:

./script < inputfile

อีกครั้งเครดิตทั้งหมดสำหรับคำตอบนี้ไปที่ผู้เขียนคำตอบใน askubuntu.com , lesmana


// โปรดอย่าลืมโหวตผู้ใช้ askubuntu.com @lesmana ถ้าคุณชอบคำตอบนี้
Nathan Basanese

6

แม้ว่าสิ่งนี้อาจซับซ้อน / หนักกว่าที่คุณต้องการ แต่วิธีหนึ่งที่ยืดหยุ่นมากในการทำคือการใช้บางอย่างเช่นExpect (หรืออนุพันธ์อย่างใดอย่างหนึ่งในภาษาโปรแกรมอื่น)

Expect เป็นภาษาที่ออกแบบมาเพื่อควบคุมแอปพลิเคชันแบบข้อความโดยเฉพาะซึ่งเป็นสิ่งที่คุณต้องการทำ หากคุณต้องทำบางสิ่งที่ซับซ้อนมากขึ้น (เช่นเดียวกับตรรกะในการตัดสินใจว่าจะทำอะไร / ตอบคำถามต่อไป) ความคาดหวังคือหนทางที่จะไป



3

หากคุณต้องการยอมรับค่าเริ่มต้นคุณสามารถใช้:

\n | ./shell_being_run

// นี่หมายความว่าคุณจะยอมรับค่าเริ่มต้นได้อย่างไร?
Nathan Basanese

2
ในbash, shและระบบการมากที่สุดซึ่งฉันรู้ว่าคุณจะต้องมิฉะนั้นก็จะไม่ได้รับการประปาคำสั่งต่อไป echo\n
2i3r
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.