ฉันมีสคริปต์ Bash shell ที่ฉันต้องการหยุดการทำงานชั่วคราวจนกว่าผู้ใช้จะกดปุ่ม ใน DOS สิ่งนี้สามารถทำได้อย่างง่ายดายด้วยคำสั่ง "หยุดชั่วคราว" มีลินุกซ์เทียบเท่าที่ฉันสามารถใช้ในสคริปต์ของฉันได้หรือไม่
ฉันมีสคริปต์ Bash shell ที่ฉันต้องการหยุดการทำงานชั่วคราวจนกว่าผู้ใช้จะกดปุ่ม ใน DOS สิ่งนี้สามารถทำได้อย่างง่ายดายด้วยคำสั่ง "หยุดชั่วคราว" มีลินุกซ์เทียบเท่าที่ฉันสามารถใช้ในสคริปต์ของฉันได้หรือไม่
คำตอบ:
read
ทำสิ่งนี้:
user@host:~$ read -n1 -r -p "Press any key to continue..." key
[...]
user@host:~$
-n1
ระบุว่ามันเพียงรอให้ตัวอักษรตัวเดียว -r
ทำให้มันเข้าสู่โหมดดิบซึ่งเป็นสิ่งจำเป็นเพราะมิฉะนั้นถ้าคุณกดทับขวาสิ่งที่ต้องการก็ไม่ได้ลงทะเบียนจนกว่าคุณจะกดปุ่มถัดไป -p
ระบุพรอมต์ซึ่งจะต้องถูกยกมาถ้ามันมีช่องว่าง อาร์กิวเมนต์เป็นสิ่งที่จำเป็นเท่านั้นถ้าคุณต้องการที่จะทราบว่าที่สำคัญพวกเขากดซึ่งในกรณีนี้คุณสามารถเข้าถึงได้ผ่านทางkey
$key
หากคุณกำลังใช้ Bash คุณสามารถระบุการหมดเวลาด้วย-t
ซึ่งทำให้การอ่านเพื่อส่งคืนความล้มเหลวเมื่อไม่มีการกดคีย์ ตัวอย่างเช่น:
read -t5 -n1 -r -p 'Press any key in the next five seconds...' key
if [ "$?" -eq "0" ]; then
echo 'A key was pressed.'
else
echo 'No key was pressed.'
fi
Press a key to continue...
แม้แต่ผู้ใช้มือใหม่ก็สามารถหาa
กุญแจแล้วกดมัน o)
read: 1: read: Illegal option -n
ตรวจสอบให้แน่ใจที่จะตัดคำสั่งของคุณในbash -c 'command && command'
ฯลฯ sh
เป็นข้อผิดพลาดที่น่าจะมาจาก ฉันกำลังทำสิ่งนี้ในคำสั่ง Lando wrapper
ฉันใช้วิธีการเหล่านี้จำนวนมากที่สั้นมากและพวกเขาก็เหมือน @theunamedguy และ @Jim โซลูชั่น แต่ด้วยการหมดเวลาและโหมดเงียบนอกจากนี้
Enterโดยเฉพาะอย่างยิ่งผมรักกรณีที่ผ่านมาและใช้มันในจำนวนมากของสคริปที่วิ่งในวงจนกว่าผู้ใช้กด
ป้อนวิธีแก้ปัญหา
read -rsp $'Press enter to continue...\n'
Escape solution (พร้อม -d $ '\ e')
read -rsp $'Press escape to continue...\n' -d $'\e'
โซลูชันที่สำคัญใด ๆ (ด้วย -n 1)
read -rsp $'Press any key to continue...\n' -n 1 key
# echo $key
คำถามที่มีตัวเลือกที่เลือกไว้ล่วงหน้า (พร้อม -ei $ 'Y')
read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;
# echo $key
โซลูชันหมดเวลาใช้งาน (พร้อม -t 5)
read -rsp $'Press any key or wait 5 seconds to continue...\n' -n 1 -t 5;
นามแฝงที่ปรับปรุงการนอนหลับ
read -rst 0.5; timeout=$?
# echo $timeout
-rระบุโหมด raw ซึ่งไม่อนุญาตให้ใช้อักขระร่วมเช่น "\" หรือ "^"
-sระบุโหมดเงียบและเนื่องจากเราไม่ต้องการเอาต์พุตแป้นพิมพ์
-p $ ' prompt 'ระบุ prompt ซึ่งต้องอยู่ระหว่าง $ 'ถึง' เพื่อให้เว้นวรรคและอักขระที่ใช้ Escape ระวังคุณต้องใส่เครื่องหมายอัญประกาศเดี่ยวกับสัญลักษณ์ดอลลาร์เพื่อรับประโยชน์จากอักขระที่หลีกเลี่ยงมิฉะนั้นคุณสามารถใช้เครื่องหมายคำพูดง่าย ๆ ได้
-d $ ' \ e 'ระบุ escappe เป็นตัวคั่นอักขระดังนั้นเป็นอักขระตัวสุดท้ายสำหรับรายการปัจจุบันนี่เป็นไปได้ที่จะใส่อักขระใด ๆ แต่ต้องระวังใส่อักขระที่ผู้ใช้สามารถพิมพ์ได้
-n 1ระบุว่าต้องการเพียงอักขระเดียวเท่านั้น
-eระบุโหมด readline
-i $ ' Y 'ระบุ Y เป็นข้อความเริ่มต้นในโหมด readline
-t 5ระบุการหมดเวลา 5 วินาที
บริการที่สำคัญในกรณีที่คุณจำเป็นต้องรู้ว่าการป้อนข้อมูลในกรณี -n1 คีย์ที่ได้รับการกด
$? ทำหน้าที่รู้รหัสทางออกของโปรแกรมสุดท้ายสำหรับการอ่าน 142 ในกรณีที่หมดเวลาป้อนข้อมูลที่ถูกต้อง 0 ใส่ $? ในตัวแปรโดยเร็วที่สุดหากคุณต้องการทดสอบหลังจากคำสั่ง somes เพราะคำสั่งทั้งหมดจะเขียน $ ใหม่?
-s
; man read
และread --help
ความช่วยเหลือไม่ได้ช่วยใน Ubuntu 10.04.1 LTS แก้ไข: help read
ทำ; ที่เหลือถูกคัดค้าน?
read: -i: invalid option
สำหรับอดีต read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;
ใน #osx read -rp $'kill-server: Are you sure (Y/n) : ' -d $'Y' key;
ใช้ได้สำหรับฉันแทน `
-i
ทำงานได้อย่างสมบูรณ์บน Ubuntu และฉันก็ไม่รู้-d
เหมือนกันว่าทำงานบน OSX ได้อย่างไร
read
โดยไม่มีพารามิเตอร์ใด ๆ จะดำเนินการต่อถ้าคุณกด Enter pause
คำสั่งDOS จะดำเนินการต่อหากคุณกดปุ่มใด ๆ ใช้read –n1
ถ้าคุณต้องการพฤติกรรมนี้
สิ่งนี้ใช้ได้กับฉันใน Linux หลายรสชาติซึ่งโซลูชันอื่น ๆ เหล่านี้ไม่ได้ (รวมถึงที่นิยมที่สุดที่นี่) ฉันคิดว่ามันอ่านได้มากขึ้นเช่นกัน ...
echo Press enter to continue; read dummy;
read
ทราบว่ามีความต้องการของตัวแปรที่จะจัดเป็นข้อโต้แย้งไปยัง
read -n1
ไม่พกพา วิธีพกพาในการทำเช่นเดียวกันอาจเป็น:
( trap "stty $(stty -g;stty -icanon)" EXIT
LC_ALL=C dd bs=1 count=1 >/dev/null 2>&1
) </dev/tty
นอกจากนี้การใช้ read
เพียงกดENTER
เพื่อดำเนินการต่อไปคุณสามารถทำได้
sed -n q </dev/tty
status=none
ไม่สามารถพกพาได้เช่นกัน เปลี่ยนเส้นทาง stdout และ stderr ไปที่ / dev / null แทน read -r line < /dev/tty
จะพอสำหรับกด ENTER ...
settings=$(stty -g); stty raw; dd ...; stty "$settings"
ถึงการบันทึกและเรียกคืนการตั้งค่า tty
tr
สิ่งที่แก้ไขสามารถใช้งานได้หรือไม่
tr
จะบัฟเฟอร์เอาต์พุตเป็นไพพ์และคีย์บอร์ดที่ไม่ใช่ของสหรัฐอเมริกามีคีย์ที่ส่งอักขระนอก\1-\177
ช่วง dd
เป็นวิธีสำนวนที่นี่
หากคุณต้องการหยุดลูปหรือสคริปต์ชั่วคราวและคุณยินดีที่จะกด Enter แทนคีย์ใด ๆ จากนั้นก็read
จะทำงานเอง
do_stuff
read
do_more_stuff
มันไม่ได้เป็นมิตรกับผู้ใช้ แต่อาจเพียงพอในกรณีที่คุณเขียนสคริปต์ด่วนสำหรับตัวคุณเองและคุณต้องหยุดมันชั่วคราวเพื่อทำบางสิ่งด้วยตนเองในพื้นหลัง
ลองสิ่งนี้:
function pause(){
read -p "$*"
}
ฟังก์ชั่นนี้ใช้งานได้ทั้งbash
และzsh
และทำให้แน่ใจว่า I / O กับเทอร์มินัล:
# Prompt for a keypress to continue. Customise prompt with $*
function pause {
>/dev/tty printf '%s' "${*:-Press any key to continue... }"
[[ $ZSH_VERSION ]] && read -krs # Use -u0 to read from STDIN
[[ $BASH_VERSION ]] && </dev/tty read -rsn1
printf '\n'
}
export_function pause
ใส่ไว้ในของคุณ.{ba,z}shrc
เพื่อความยุติธรรม!
ใช่ที่จะใช้read
- และมีการปรับแต่งสองสามอย่างที่ทำให้มีประโยชน์มากที่สุดทั้งcron
ในและในเครื่อง
ตัวอย่าง:
time rsync (options)
read -n 120 -p "Press 'Enter' to continue..." ; echo " "
-n 120 ทำให้เวลาอ่านคำสั่งออกมาหลังจาก 2 cron
นาทีจึงจะไม่ปิดกั้นใน
ในเทอร์มินัลมันใช้เวลา 2 นาทีเพื่อดูว่าrsync
คำสั่งใช้เวลาดำเนินการนานเท่าใด
จากนั้นตามมาecho
คือการให้พรอมต์ทุบตีที่ตามมาจะปรากฏในบรรทัดถัดไป
มิฉะนั้นจะแสดงบนบรรทัดเดียวกันโดยตรงหลังจาก "ดำเนินการต่อ ... " เมื่อEnterกดในเทอร์มินัล
"Enter any non-NUL character to continue"
พูดอย่างเคร่งครัดที่จะเป็น ปุ่มบางปุ่มไม่ส่งอักขระใด ๆ (เช่นCtrl
... ) และบางปุ่มส่งมากกว่าหนึ่งตัว (เช่นF1
,Home
... )bash
ละเว้นอักขระ NUL