I recently needed to collect arrow keys (and function keys etc.) in a shell script so that I could run a text graphics-style data entry system (with text entry fields, drop-down list boxes, progress bars and the like). Yes you can do all this in shell, and portably too if you're careful.
I've seen others asking how to capture keypresses in shell scripts in the past, with a variety of responses from other people, so thought you might all like to see a little mock-up program that catches keypresses and reports the key that was pressed. This has been tested in Solaris, Linux (SuSE) and AIX. It's written in ksh just because I like it, but would equally work in bash if you changed the 'print' commands to 'echo'. The script reports 10 keypresses in octal and then exits. Note the use of 'tput' to determine the correct terminal codes.
Enjoy.
Code:
#!/bin/ksh
AWK=gawk
[ -x /bin/nawk ] && AWK=nawk
ECHO="print"
ECHO_N="print -n"
tty_save=$(stty -g)
function Get_odx
{
od -t o1 | $AWK '{ for (i=2; i<=NF; i++)
printf("%s%s", i==2 ? "" : " ", $i)
exit }'
}
# Grab terminal capabilities
tty_cuu1=$(tput cuu1 2>&1 | Get_odx) # up arrow
tty_kcuu1=$(tput kcuu1 2>&1 | Get_odx)
tty_cud1=$(tput cud1 2>&1 | Get_odx) # down arrow
tty_kcud1=$(tput kcud1 2>&1 | Get_odx)
tty_cub1=$(tput cub1 2>&1 | Get_odx) # left arrow
tty_kcub1=$(tput kcud1 2>&1 | Get_odx)
tty_cuf1=$(tput cuf1 2>&1 | Get_odx) # right arrow
tty_kcuf1=$(tput kcud1 2>&1 | Get_odx)
tty_ent=$($ECHO | Get_odx) # Enter key
tty_kent=$(tput kent 2>&1 | Get_odx)
tty_bs=$($ECHO_N "\b" | Get_odx) # Backspace key
tty_kbs=$(tput kbs 2>&1 | Get_odx)
# Some terminals (e.g. PuTTY) send the wrong code for certain arrow keys
if [ "$tty_cuu1" = "033 133 101" -o "$tty_kcuu1" = "033 133 101" ]; then
tty_cudx="033 133 102"
tty_cufx="033 133 103"
tty_cubx="033 133 104"
fi
stty cs8 -icanon -echo min 10 time 1
stty intr '' susp ''
trap "stty $tty_save; exit" INT HUP TERM
count=0
while :; do
[ $count -eq 10 ] && break
count=$((count+1))
keypress=$(dd bs=10 count=1 2> /dev/null | Get_odx)
$ECHO_N "keypress=\"$keypress\""
case "$keypress" in
"$tty_ent"|"$tty_kent") $ECHO " -- ENTER";;
"$tty_bs"|"$tty_kbs") $ECHO " -- BACKSPACE";;
"$tty_cuu1"|"$tty_kcuu1") $ECHO " -- KEY_UP";;
"$tty_cud1"|"$tty_kcud1"|"$tty_cudx") $ECHO " -- KEY_DOWN";;
"$tty_cub1"|"$tty_kcub1"|"$tty_cubx") $ECHO " -- KEY_LEFT";;
"$tty_cuf1"|"$tty_kcuf1"|"$tty_cufx") $ECHO " -- KEY_RIGHT";;
*) $ECHO;;
esac
done
stty $tty_save
Hey Guys ,
How do we trap the arrow keys in shell programming.
Or atleast can we read the ascii code of the arrow keys.
I want to read the arrow keys pressed by the user
and accordingly highlight the corresponding menu option.
Is it possible in shell to do so ??
... (1 Reply)
how to use the arrow keys in shell scripting. is there any special synatax / command for this.
i just want to use the arrow keys for navigation.
replies appreciated
raguram R (3 Replies)
I would like to get a script to respond to arrow key presses to scroll up and down a menu.
The platform is CDLinux which uses a prehistoric version of bash, version 1.14.7.
I would like to do something like "read -sn 1 keyin" but the "read" command is so primative that it only has the -r... (1 Reply)
Hello,
I am unable to use the arrow keys in some applications. For example, in bash, I am able to use the arrow keys to to go back and forth characters in current line and search the history--I can do everything you'd expect to be able to do with the arrow keys. However, in bc, I cannot use... (4 Replies)
hi,
can anyone tell me how to enable arrow keys to scroll thru the commands on command prompt.
I am using C shell ( I know, in k shell, set -o vi would enable vi command history, but set -o doesnte exist in c shell) (4 Replies)
Hi
I am working on SunOS 5.10 from remote terminal using putty.
Also
echo $TERM
xterm
In vi editor when in insert mode arrow keys are not working for cursor movement instead they print A B C and D.
Please help.
thanks
ravs (7 Replies)
hello everybody,
as many, I have a problem with a script...
I wrote a shell script in which I want to read a variable value. the problem is that I can't use the arrow keys.
Here is the script I use :
#!/bin/bash
stty erase ^H
read foune
echo "$foune"
exit 0;
the problem is... (2 Replies)
Hi,
I'm having a problem with my ssh link to various Sun servers running Solaris 9 and 10 from an Windows XP box running Cygwin/X.
I am using ssh to connect to a number of different Sun servers. My problem is that when editing a remote shell command line with the arrow direction keys the... (0 Replies)
I would like to configure the key combination Tux-J (Win-J) as Down Arrow, and the rest of the VIM-style movement keys as well (HKL). What is the best way to do this so that it will work in all applications? I thought about editing the keyboard layout but I'm not sure how to do that for Tux-key... (2 Replies)
Would somebody advise how arrow keys could be binded in AIX v5.3?
I could not find reasonable information online related to AIX.
I've meat advises to define:
alias __A=$'\020' # or the same: alias __A=$(echo "\020")
alias __B=$'\016'
alias __C=$'\006'
alias __D=$'\002'
But it does... (2 Replies)