ป้อนอินพุตโดยอัตโนมัติในบรรทัดคำสั่ง


141

ฉันกำลังเรียกใช้สคริปต์ที่ขอให้ป้อน 'y' ในแต่ละการดำเนินการฉันกำลังมองหาโซลูชันที่ต้องการ$ ./script < echo 'yyyyyyyyyyyyyy'ส่งผ่านอินพุตทั้งหมดของฉันในครั้งเดียว


บางครั้ง-fตัวเลือกทำงานได้ดีกับคำสั่งบางอย่าง
iammilind

คำตอบ:


257

มีคำสั่งที่สร้างขึ้นเฉพาะสำหรับกรณีนั้น: yes

$ yes | ./script

สิ่งนี้จะสามารถเชื่อมต่อการส่งออกของการป้อนข้อมูลของyes ./scriptดังนั้นเมื่อ./scriptขอให้ผู้ใช้ป้อนข้อมูลมันจะได้รับผลลัพธ์yesแทน ผลลัพธ์ของyesคือกระแสที่ไม่สิ้นสุดของการyขึ้นบรรทัดใหม่ ดังนั้นโดยทั่วไปเช่นถ้าผู้ใช้จะเข้าสู่คำถามของทุกy./script

หากคุณต้องการปฏิเสธไม่ใช่ ( n) แทนใช่ ( y) คุณสามารถทำได้ดังนี้:

$ yes n | ./script

โปรดทราบว่าเครื่องมือบางตัวมีตัวเลือกที่จะถือว่าyesเป็นคำตอบเสมอ ดูที่นี่ตัวอย่างเช่น: ข้ามผ่านพรอมต์ใช่ / ไม่ใช่ใน 'apt-get upgrade'


วิธีอื่น ๆ ในการป้อนข้อมูล:

หากคุณทราบว่าyสคริปต์ของคุณคาดหวังว่าคุณจะทำได้เช่นนี้:

$ printf 'y\ny\ny\n' | ./script

ขึ้นบรรทัดใหม่ ( \n) เป็นปุ่มป้อน

การใช้printfแทนคุณyesจะมีการควบคุมอินพุตที่ละเอียดยิ่งขึ้น:

$ printf 'yes\nno\nmaybe\n' | ./script

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

$ printf 'yyy' | ./script

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

$ ./script << EOF
y
y
y
EOF

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

$ ./script <<< "y
y
y
"

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

$ ./script < inputfile

หากคำสั่งมีความซับซ้อนเพียงพอและวิธีการข้างต้นไม่เพียงพอคุณสามารถใช้ความคาดหวังได้

นี่คือตัวอย่างของสคริปต์คาดหวังที่ง่ายที่สุด:

spawn ./script
expect "are you sure?"
send "yes\r"
expect "are you really sure?"
send "YES!\r"
expect eof

nitpick ทางเทคนิค:

การเรียกใช้คำสั่งสมมุติฐานที่คุณให้ไว้ในคำถามของคุณไม่ทำงาน:

$ ./script < echo 'yyyyyyyyyyyyyy'
bash: echo: No such file or directory

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

$ ./script 'yyyyyyyyyyyyyy' < echo
bash: echo: No such file or directory

ซึ่งหมายความว่า./scriptจะถูกเรียกว่ามีการโต้แย้ง'yyyyyyyyyyyyyy'และ stdin echoจะได้รับข้อมูลจากไฟล์ชื่อ และทุบตีบ่นเนื่องจากไฟล์ไม่มีอยู่


1
cannot enable tty mode on non tty inputฉันได้รับ คุณจะรู้วิธีแก้ปัญหาสำหรับสิ่งนั้นหรือไม่?
bmpasini

เมื่อฉันลองใช้printfเคล็ดลับกับrunไฟล์ที่ฉันต้องการเพื่อให้กระบวนการติดตั้งเป็นอัตโนมัติสิ่งที่เกิดขึ้นคือฉันได้รับข้อความแจ้งข้อผิดพลาดWarning: Tried to connect to session manager, None of the authentication protocols specified are supportedและสคริปต์จะเปิดขึ้นในเทอร์มินัลใหม่และขอให้ฉันป้อนข้อมูลด้วยตนเองตามปกติ นี่คือสิ่งที่เกิดขึ้นใน Debian โดยวิธีการ ข้อเสนอแนะใด ๆ
DavidB

ต้องการรายละเอียดเพิ่มเติม ใหญ่เกินไปสำหรับความคิดเห็น กรุณาถามคำถามใหม่พร้อมรายละเอียดทั้งหมด คุณสามารถใส่ลิงค์ที่นี่
lesmana

ไม่มีอะไรทำงานกับ 'คนพเนจรทำลาย' บน centos
Drew

ชั่วร้ายง่าย ๆ ! ทำงานบนการนำเข้าข้อมูล Google Cloud Beta SQL! ชื่นชมมาก!
G_Style

11

ใช้คำสั่งyes:

yes | script

ตัดตอนมาจากหน้าคน:

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'.

9

บางสิ่ง ( apt-getตัวอย่าง) ยอมรับธงพิเศษเพื่อให้ทำงานในโหมดเงียบ (และยอมรับค่าเริ่มต้น) ในapt-getกรณีของคุณเพียงแค่ส่ง-yธง สิ่งนี้จะขึ้นอยู่กับสคริปต์ของคุณอย่างสมบูรณ์

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

# 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เชลล์สคริปต์ได้ใช่ไหม หรือมีวิธี?
Shayan

7

ในเชลล์สคริปต์คุณยังสามารถใช้เคล็ดลับต่อไปนี้ของการวางไข่คาดหวังและส่ง

spawn script.sh
expect "Are you sure you want to continue connecting (yes/no)?"
send "yes"

อย่างไรก็ตามใน scenerio ข้างต้นคุณจะต้องให้วลีที่คุณคาดหวังว่าจะได้รับในขณะที่คุณรันสคริปต์สำหรับตัวอย่างเพิ่มเติมไปที่ลิงค์ต่อไปนี้

คาดหวังภายใน Bash


2

ตกลงนี่อาจไม่ใช่โซลูชันที่หรูหรามาก แต่ถ้าคุณเขียนตัวเลือกของคุณในไฟล์แยกต่างหากจากนั้นส่งเป็นอินพุตไปยังสคริปต์ก็จะทำงานได้เช่นกัน ดังนั้นหากคุณสร้างไฟล์ใหม่ที่มีตัวเลือกทั้งหมดของคุณ (เรียกไฟล์นี้ว่า 'options.in') คุณสามารถเรียกใช้สคริปต์ของคุณได้อย่างง่ายดายด้วย./script.sh < options.inและแก้ไข / สร้างไฟล์ตัวเลือกต่าง ๆ ตามความเหมาะสม


ฉันจะเขียนoptions.inไฟล์ได้อย่างไร? คุณยกตัวอย่างได้ไหม
Shayan

0

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

# -Wy force signaturewipe (if exists)
echo "y" | sudo lvcreate -W y -n $lvName -L "$lvSize"G /dev/"$svg" >> $nfsUtilLog

-1

คุณสามารถป้อนข้อมูลผู้ใช้ไปยังสคริปต์ของคุณด้วยcatจากไฟล์ข้อความไปยังสคริปต์ของคุณด้วยbashสิ่งนี้:

cat input.txt | bash your_script.sh

เพียงแค่ใส่ข้อมูลผู้ใช้ที่คุณต้องการลงในไฟล์ input.txt สิ่งที่คุณต้องการคำตอบไม่ว่าจะเป็น y, n, ตัวเลข, สตริง ฯลฯ



@muru สำหรับฉันทางออกที่คุณพูดถึงไม่ได้ผลดังนั้นฉันจึงต้องคิดค้นของตัวเอง
ดูแลเว็บ

ไม่แน่ คุณทั้งสองอธิบายสิ่งเดียวกัน
muru

@muru ความคิดที่เหมือนกันของคำตอบการจัดหาจากไฟล์ (ซึ่งสามารถทำได้หลายวิธี) ไม่ได้เป็นสิ่งเดียวกันและยิ่งไปกว่านั้นมันก็ประสบความสำเร็จในวิธีที่แตกต่างกัน คุณควรจะเห็นมัน หากวิธีการแก้ปัญหาที่คุณชี้ให้เห็นนั้นใช้ได้ผลสำหรับฉันฉันจะไม่ใช้เวลาในการปรับเปลี่ยนพวงมาลัยในวันนี้ คุณอาจใช้สิ่งใดก็ได้ที่เหมาะกับคุณ
ดูแลเว็บ

@muru ผมเชื่อว่ามีความแตกต่างระหว่างสองบางอย่างที่อธิบายไว้ในคำตอบที่บอกว่าที่นี่askubuntu.com/questions/172982/... สำหรับฉันตัวอย่างเช่นรหัสของฉันถ้าเอาท์พุทถูกเปลี่ยนเส้นทางไปยังไฟล์ดูเหมือนชัดเจนมากขึ้นเป็นไหลธรรมชาติจากซ้ายไปขวา ท้ายที่สุดการ downvoting ทำงานได้ดีเช่นคุณไม่ได้กระตุ้นผู้คนให้แชร์โซลูชันของพวกเขาที่นี่ ฉันเชื่อว่าสิ่งนั้นเพียงพอที่จะลบ downvoting ออก
ดูแลเว็บ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.