Nyomja meg a szóköz billentyűt a folytatáshoz

Hogyan állíthatom le a bash szkriptet, amíg a felhasználó nem nyomja meg a szóköz gombot?

Szeretném, ha a kérdés szerepelne a szkriptemben.

A folytatáshoz nyomja meg a szóköz vagy a CTRL + C kilépéshez

, majd a parancsfájlnak le kell állnia, és várnia kell, amíg a szóköz lenyomásra kerül.

Megjegyzések

Válasz

Használhatja a read szót:

read -n1 -s -r -p $"Press space to continue...\n" key if [ "$key" = " " ]; then # Space pressed, do something # echo [$key] is empty when SPACE is pressed # uncomment to trace else # Anything else pressed, do whatever else. # echo [$key] not empty fi 

A " " helyét a fenti szó helyére írja le: "" az Enter kulcshoz, $"\t" a Tab billentyűhöz.

Megjegyzések

  • Hozzá kell adnia -s, hogy ne nyomtassa ki a kinyomtatott karaktert a terminálra. És adjon hozzá egy sortörést a végén, különben a kimenet közvetlenül ugyanabban a sorban folytatódik, mint a kérdés. A legjobb az lenne: read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
  • Ez a szkript nem működik ‘. Csak teszteltem a Red Hat linuxon … A else blokk mindig fut, még akkor is, ha a szóköz lenyomva van.
  • @robert It ‘ s, mert nem ‘ nem használja a bash t. Akkor működik, ha helyette a read _ -t használja, ha a bash -en kívül más héja van.
  • Ha a '' tartalmaz egy szóközt belül?
  • Ez az STDIN-től olvasható, ami pipeline | script.sh megadott problémákat okoz. Lásd: ez a válasz a megoldáshoz.

Válasz

A módszer ebben a SO-ban tárgyalt Q & A valószínűleg a legjobb jelölt az pause viselkedés alternatívájaként, amelyet Ön szokott a Windows rendszeren, amikor BAT fájlokat csinálok.

$ read -rsp $"Press any key to continue...\n" -n1 key 

Példa

Itt a fentieket futtatom, majd egyszerűen megnyomok bármely billentyűt, jelen esetben a D kulcs.

$ read -rsp $"Press any key to continue...\n" -n1 key Press any key to continue... $ 

Hivatkozások

Megjegyzések

  • Mármint a $ befo írd vissza a karakterláncot ide: -rsp $'Press?
  • @ rubo77 – ah. Így ‘ képes megtenni egy szó szerinti karakterláncot speciális karakterekkel. Ez ‘ formája: $ ‘ … ‘
  • @ rubo77 – ez ‘ más. Ez ‘ egy dollárjel dupla idézőjelekkel, én egy dollár / egy árajánlatot használtam. Kérjük, törölje ezt a megjegyzést, ez ‘ rossz.
  • Ah, értem. Abban az esetben, ha a megszakadt szekvenciákat a prompt-stringbe helyezi. lásd: wiki.bash-hackers.org/syntax/quoting#ansi_c_like_strings
  • @ rubo77 – igen, a jelölés lehetővé teszi a menekülési szekvenciák felvételét nincs extra echo -e "..." sor. ‘ sokkal kompaktabb ezekben a helyzetekben.

Válasz

Létrehozhatna egy függvényt hozzá:

pause(){ read -n1 -rsp $"Press any key to continue or Ctrl+C to exit...\n" } 

Ezután a parancsfájl mindenhol használható:

pause 

Megjegyzések

  • ha még nem ismeri a shell parancsfájlokat – a függvényt a szkript tetejére kell helyezni, mielőtt használni szeretné

Válasz

hold=" " printf "Press "SPACE" to continue or "CTRL+C" to exit : " tty_state=$(stty -g) stty -icanon until [ -z "${hold#$in}" ] ; do in=$(dd bs=1 count=1 </dev/tty 2>/dev/null) done stty "$tty_state" 

Ez most egy parancssorot nyomtat új sor nélkül, megbízhatóan kezeli az CTRL+C -et, csak annyiszor hívja meg a stty -et, ahányszor csak szükséges, és pontosan visszaállítja a vezérlő tty-t arra az állapotra, amelyben stty megtalálta. A man stty oldalon talál információkat arról, hogyan lehet kifejezetten visszhangokat, karaktereket és mindet vezérelni.

Megteheti ezt is:

printf "Press any key to continue or "CTRL+C" to exit : " (tty_state=$(stty -g) stty -icanon LC_ALL=C dd bs=1 count=1 >/dev/null 2>&1 stty "$tty_state" ) </dev/tty 

Megteheti ENTER, nem [ tesztekkel ] és nem stty, mint:

sed -n q </dev/tty 

megjegyzések

  • Úgy tűnik, hogy a két utolsó megoldás a /bin/sh -nel (pl. FreeBSD-n) is jól működik, nem csak a bash-val.
  • a válasz a SO egyenértékű, vagy még jobb?

Válasz

Itt van egy olyan mód, amely mindkét módon működik bash és zsh, és biztosítja a terminál I / O-t:

# 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 

Helyezze be a .{ba,z}shrc a nagy igazságosságért!

Válasz

lusta egy vonal:

echo "Press any key to continue or Ctrl+C to cancel" read && do_something.sh 

A hátrány az, hogy elveszíti az irányítást, amikor a felhasználó megnyomja a ctrl + c billentyűt. Ebben az esetben a szkript mindig 130-as kóddal lép ki.

Válasz

Beállítások IFS az üres karakterlánc elnyomásához elnyomja az olvasott alapértelmezett viselkedést a szóköz csökkentésében.

try_this() { echo -n "Press SPACE to continue or Ctrl+C to exit ... " while true; do # Set IFS to empty string so that read doesn"t trim # See http://mywiki.wooledge.org/BashFAQ/001#Trimming IFS= read -n1 -r key [[ $key == " " ]] && break done echo echo "Continuing ..." } try_this 

UPDATE 2018-05-23: Ezt leegyszerűsíthetjük a REPLY változó használatával, amely nem tartozik szófelosztásra:

try_this() { echo -n "Press SPACE to continue or Ctrl+C to exit ... " while true; do read -n1 -r [[ $REPLY == " " ]] && break done echo echo "Continuing ..." } try_this 

Válasz

Itt található a egyszerű megoldás a folytatáshoz (nem ENTER)

read -s -d " "

Ez addig vár, amíg megnyomja a szóközt. Igen, csak a szóköz, nem törik el, ha megnyomja az Enter billentyűt.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük