ฉันกำลังเรียกใช้สคริปต์ที่ขอให้ป้อน 'y' ในแต่ละการดำเนินการฉันกำลังมองหาโซลูชันที่ต้องการ$ ./script < echo 'yyyyyyyyyyyyyy'
ส่งผ่านอินพุตทั้งหมดของฉันในครั้งเดียว
ฉันกำลังเรียกใช้สคริปต์ที่ขอให้ป้อน 'y' ในแต่ละการดำเนินการฉันกำลังมองหาโซลูชันที่ต้องการ$ ./script < echo 'yyyyyyyyyyyyyy'
ส่งผ่านอินพุตทั้งหมดของฉันในครั้งเดียว
คำตอบ:
มีคำสั่งที่สร้างขึ้นเฉพาะสำหรับกรณีนั้น: 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
จะได้รับข้อมูลจากไฟล์ชื่อ และทุบตีบ่นเนื่องจากไฟล์ไม่มีอยู่
cannot enable tty mode on non tty input
ฉันได้รับ คุณจะรู้วิธีแก้ปัญหาสำหรับสิ่งนั้นหรือไม่?
printf
เคล็ดลับกับrun
ไฟล์ที่ฉันต้องการเพื่อให้กระบวนการติดตั้งเป็นอัตโนมัติสิ่งที่เกิดขึ้นคือฉันได้รับข้อความแจ้งข้อผิดพลาดWarning: Tried to connect to session manager, None of the authentication protocols specified are supported
และสคริปต์จะเปิดขึ้นในเทอร์มินัลใหม่และขอให้ฉันป้อนข้อมูลด้วยตนเองตามปกติ นี่คือสิ่งที่เกิดขึ้นใน Debian โดยวิธีการ ข้อเสนอแนะใด ๆ
ใช้คำสั่ง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'.
บางสิ่ง ( 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
เชลล์สคริปต์ได้ใช่ไหม หรือมีวิธี?
ในเชลล์สคริปต์คุณยังสามารถใช้เคล็ดลับต่อไปนี้ของการวางไข่คาดหวังและส่ง
spawn script.sh
expect "Are you sure you want to continue connecting (yes/no)?"
send "yes"
อย่างไรก็ตามใน scenerio ข้างต้นคุณจะต้องให้วลีที่คุณคาดหวังว่าจะได้รับในขณะที่คุณรันสคริปต์สำหรับตัวอย่างเพิ่มเติมไปที่ลิงค์ต่อไปนี้
ตกลงนี่อาจไม่ใช่โซลูชันที่หรูหรามาก แต่ถ้าคุณเขียนตัวเลือกของคุณในไฟล์แยกต่างหากจากนั้นส่งเป็นอินพุตไปยังสคริปต์ก็จะทำงานได้เช่นกัน ดังนั้นหากคุณสร้างไฟล์ใหม่ที่มีตัวเลือกทั้งหมดของคุณ (เรียกไฟล์นี้ว่า 'options.in') คุณสามารถเรียกใช้สคริปต์ของคุณได้อย่างง่ายดายด้วย./script.sh < options.in
และแก้ไข / สร้างไฟล์ตัวเลือกต่าง ๆ ตามความเหมาะสม
options.in
ไฟล์ได้อย่างไร? คุณยกตัวอย่างได้ไหม
ฉันกำลังเขียนสคริปต์ทุบตีกับ Dialog และต้องการให้สิ่งนี้เกิดขึ้นโดยอัตโนมัติด้วย ฉันทำสิ่งนี้และมันได้ผลเหมือนมีเสน่ห์
# -Wy force signaturewipe (if exists)
echo "y" | sudo lvcreate -W y -n $lvName -L "$lvSize"G /dev/"$svg" >> $nfsUtilLog
คุณสามารถป้อนข้อมูลผู้ใช้ไปยังสคริปต์ของคุณด้วยcat
จากไฟล์ข้อความไปยังสคริปต์ของคุณด้วยbash
สิ่งนี้:
cat input.txt | bash your_script.sh
เพียงแค่ใส่ข้อมูลผู้ใช้ที่คุณต้องการลงในไฟล์ input.txt สิ่งที่คุณต้องการคำตอบไม่ว่าจะเป็น y, n, ตัวเลข, สตริง ฯลฯ
-f
ตัวเลือกทำงานได้ดีกับคำสั่งบางอย่าง