ฉันจะตอบ y โดยอัตโนมัติในสคริปต์ทุบตีได้อย่างไร


15

ฉันต้องการถอนการติดตั้งโปรแกรมผ่านสคริปต์ทุบตี หลังจากฉันรันคำสั่งเทอร์มินัลจะถามฉันว่าฉันแน่ใจหรือไม่ว่าต้องการถอนการติดตั้ง yดังนั้นผมจึงจำเป็นต้องตอบ ฉันต้องการที่จะทำมันโดยอัตโนมัติและตอบyหลังจากล่าช้า 10 วินาที

ฉันทำตัวอย่างนี้ แต่มันไม่ทำงาน -

#!/usr/bin
/opt/MNG/MNGVIEWHP/fe/uninstall
sleep 10
echo "y"

ความคิดใด ๆ Centos 7.2


6
ITYM #! /bin/bash -แทน#!/usr/bin
Stéphane Chazelas

ตรวจสอบว่าuninstallโปรแกรมยอมรับพารามิเตอร์หรือสคริปต์กำหนดค่าหรือไม่ มันจะง่ายขึ้นด้วยวิธีนี้
phuclv

1
ถามและตอบโฆษณาคลื่นไส้ทั่วทั้งเว็บ " มันไม่ทำงาน"ไม่ใช่การตัดสินใจที่ดีของปัญหา บางทีคุณสามารถระบุได้ว่าปัญหาของคุณแตกต่างจากคนอื่น ๆ นับไม่ถ้วน

2
สิ่งที่สคริปต์ของคุณทำจริง: รันuninstallและรอให้สคริปต์ออก จากนั้นนอน 10 วินาที จากนั้นสะท้อนy\nไปยัง stdout (ซึ่งยังคงเชื่อมต่อกับเทอร์มินัลไม่ใช่เพื่อ stdin ของโปรแกรมใด ๆ )
Peter Cordes

คำตอบ:


49

นั่นคือสิ่งที่yesคำสั่งมีไว้สำหรับ มันส่งออกyหนึ่งบรรทัดต่อบรรทัดไปเรื่อย ๆ เพื่อให้สามารถไพพ์ไปยังคำสั่งที่ถามคำถามใช่ / ไม่ใช่

yes | /opt/MNG/MNGVIEWHP/fe/uninstall

นั่นเป็นคำตอบyสำหรับทุกคำถาม เพื่อที่จะตอบnทุกคำถามแทนด้วยyes yes nสำหรับการผสมผสานที่กำหนดไว้ล่วงหน้าของyและnคุณสามารถแทนที่yesด้วย:

printf '%s\n' y n n y y n...

หรือเรียกใช้เป็น:

/opt/MNG/MNGVIEWHP/fe/uninstall << 'EOF'
y
n
n
y
y
n
EOF

หากคุณต้องการคำตอบไม่ให้อ่านก่อน 10 วินาทีคุณจะทำ:

(sleep 10; echo y; sleep 2; echo n;...) | /opt/MNG/MNGVIEWHP/fe/uninstall

แต่นั่นอาจจะไม่จำเป็นเมื่อเราเขียนyลงไปในท่อมันจะมีไว้uninstallให้อ่านทุกครั้งที่ต้องการอ่านมันไม่น่าที่คุณจะต้องรอให้พร้อมที่จะอ่าน ข้อยกเว้นจะเป็นถ้าuninstallตัดสินใจที่จะล้างข้อมูลก่อนที่จะถามคำถาม

ทั้งหมดเหล่านั้นถือว่าuninstallคำสั่งอ่านคำตอบแต่ละคำตอบเป็นหนึ่งบรรทัดอินพุตจากอินพุตมาตรฐาน

สำหรับกรณีที่ซับซ้อนมากขึ้นที่คำสั่งอ่านคำตอบโดยตรงจากอุปกรณ์ tty หรือที่คุณจำเป็นต้องตอบฟีดเงื่อนไข (เช่นตามสิ่งที่ผลคำสั่ง) ที่ที่คุณต้องการใช้สิ่งที่ต้องการexpectหรือ'szshzpty

โปรดทราบว่าโปรแกรมแบบโต้ตอบจำนวนมากสามารถเข้าสู่โหมดที่ไม่ใช่แบบโต้ตอบได้เมื่อผ่านตัวเลือก คุณอาจต้องการตรวจสอบคู่มือของพวกเขาก่อนที่จะใช้ความพยายามมากเกินไปในการแก้ไขปัญหา


ขอบคุณ! เป็นสิ่งที่ดีในกรณีที่เราต้องตอบคำถามเดียวเท่านั้น เกิดอะไรขึ้นถ้าเราต้องตอบคำถาม 20 ข้อ?
Shalev Sason

@Shalev ดูการแก้ไข
Stéphane Chazelas

ขอบคุณมาก! ดังนั้นถ้าฉันต้องการป้อนค่าอื่นเช่น interger (ตัวอย่างเช่น 2) ฉันต้องแทนที่มันแทน "y"? printf '% s \ n' ynnyyn 2 3 ny | / opt / MNG / MNGVIEWHP / fe / ถอนการติดตั้ง
Shalev Sason

ใช่นั่นคือความคิด
Stéphane Chazelas

3
@ShalevSason ในการแก้ปัญหาทั้งหมดที่ฉันให้เหมือนecho "y"ทุกครั้งที่เราเขียนy<newline>จำลองคุณกดyตามด้วย Enter หากคุณต้องการจำลองการกด Enter เพียงอย่างเดียวนั่นจะเป็นการป้อนบรรทัดว่างดังนั้นprintf '%s\n' y n '' 2 3(ซึ่ง''เป็นบรรทัดว่าง)
Stéphane Chazelas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.