The problem is to send a (Posix-) terminal query string to the terminal where the (interactive) shell is running, and to read the response from the terminal. For example, when we send Escape followed by the letter Z, the terminal is supposed to respond with the terminal ID. This response also starts with an Escape, followed by an arbitrary number of characters. Since I don't know the number of characters returned in advance, I have to accumulate them one by one.
This is the solution I achieved with bash, ask_tty.sh:
If I run in my terminal either ask_tty.sh Z or ask_tty.sh (because I made Z the default value), I get as response on stdout
[?63;1;2;4;6;9;15;22;29c
The actual reading of each character is done by read -rs -t 1 -n 1 <$tty.
I feel that for adapting this solution to Zsh, I have to change the bash read to an equivalent Zsh read, but I could not get it done: Either the command hangs, or it returns only the first character of the answer string. For instance, I tried read -rs -t -k and read -rs -t 1 -k 1.
How can I solve this in Zsh?
Update: I'm using Zsh 5.3 (given the evolution of Zsh, version might matter here), running on Cygwin.
Last edited by rovf; 01-03-2018 at 09:46 AM..
Reason: Providing additional information
According to the man page, this can not work. Quoting the man-page:
-q Read only one character from the terminal and set name to `y' if this character was `y' or `Y' and to `n' otherwise.
So, even if it would work, it would not return the answered character, but set my variable to y or n.
Interestingly, the actual effect is that I don't even get this result, but instead the script loops forever, always returning n. It doesn't seem to actually "consume" the character.
In bash you could simplify the logic as -t will timeout if a full line is not received
Under zsh -t is just a timeout for the first character being available. Use return value of read to detect a timeout, as REPLY is not emptied on timeout:
Last edited by Chubler_XL; 01-03-2018 at 09:30 PM..
This does work too, indeed, though I don't fully understand the script: Why do we need the count parameter here. I see that we do need it, because when I set it to a higher value or omit it, the script hangs (probably waiting for input). But how does this parameter make it work?
I understand that with count=1, you tell dd to return one block only, where the default block size is 512 bytes. I can understand, how this works, when reading from a file, but how does dd know that it has finished reading? There is, I think, no EOF when reading from /dev/tty, and if there were an EOF condition, the count parameter would not be needed at all.
The assumption is that the terminal will send its entire response to your terminal query in a single burst of characters. That burst of characters will be read as one "block" by dd and with the directive count=1 it will quit after it has successfully read that single block. Without the count=1, dd will continue reading blocks from the terminal until it hits an EOF condition, which won't happen until you type CTL-D (i.e., hold down the control key while you hit the "d" key).
This User Gave Thanks to Don Cragun For This Post:
I don't know if you guys get this problem sometimes at Terminal but I had been having this problem since yesterday :( Maybe I overdid the Terminal. Even the codes that used to work doesn't work anymore.
Here is what 's happening:
* I wanted to remove lines containing digits so I used this... (25 Replies)
Hi All,
I have a requirement to read response file which looks like below
Ex:
NAME=SAM
DOB=01/01/1980
ADDRESS=
7658 James Street
NewYork
0000
Now, I need to take NAME, DOB, ADDRESS into variables
I am fine taking NAME and DOB
I need help on how can I... (6 Replies)
Solaris terminal responding very slow .. we have recently put a T3 hardware in to production , the applications running are it are perfectly and no complaints from user ..but when i ssh to the server ... the terminal response is very very slow .. it takes 3 seconds to show the character i type ..... (3 Replies)
Is there hopefully a way to search for an exact string in Man Pages? I know if I want to search for anything containing -c I can just do this.
/-c
How would I search for "-c"? I want only "-c" to show up. So I tried this.
/"-c"
It took me literally and looked for the quotes also. (13 Replies)
How can I get a bash script to wait and read and count $i messages that a running program (drbl clonezilla) sends to the console (terminal) and only then move on to the next line in the script when the count is matched (the next line is the last line of the script and is a reboot)?
The script... (0 Replies)
Hi - I am getting the error
`Error reading response length from authentication socket'
when I ssh from my cluster to another cluster, and then back to my cluster. It doesn't seem to affect anything, but it's just annoying that it always pops up and tends to confuse new users of the cluster. I... (1 Reply)
My company has a private network, including a Apache web server (Linux) and some WinXP machines. The web server had been configured to use mod_proxy to connect to window update site via another company proxy server. It works for few years.
Recently, some parties had setup a DNS server on the... (2 Replies)
I have a shell script that is building a string that consists of the parts of a command that I want run at the end of the string. So it looks like this:
$PART1=/path/to/command
$PART2="-arg1"
$PART3="-arg2"
and so on.
At the end of the command is a list of files I get from a loop and... (2 Replies)
Hi ALL:
I am not able to get the response back from weblogic in the shell script.
The weblogic server in different account. I am able to login to that account and bring the server up but while doing a ping, the script is failing. While the same script is running fine if I run it on the account... (1 Reply)
I am trying to write a korn shell script which posts commands to a server and read the response back from the server.
Any idea how I can read the servers response?
I have tried doing the following:
(
LOGIN:xxxxx
command to server
read ANSWER
echo $ANSWER >file1... (4 Replies)