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
- Mindezek és még sok más ezzel a kérdéssel foglalkozik Q & A BTW: Mi a linux megfelelője a DOS szüneteltetéséhez?
- Lásd még: A Shell szkript szüneteltetése addig, amíg a ciklusban nem nyomja meg az Enter billentyűt
- kapcsolódó: unix.stackexchange.com/questions/293940/…
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
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.
read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
else
blokk mindig fut, még akkor is, ha a szóköz lenyomva van.bash
t. Akkor működik, ha helyette aread _
-t használja, ha abash
-en kívül más héja van.''
tartalmaz egy szóközt belül?pipeline | script.sh
megadott problémákat okoz. Lásd: ez a válasz a megoldáshoz.