I\'ve been trying to display the type of terminal being used as the name only. For instance if I was using konsole it would display konsole. So far I\'ve been using this command
No guarantees here, but I think this will work most of the time, on linux:
ps -ocomm= $(lsof -tl /proc/$$/fd/0 | grep -Fxf <(lsof -t /dev/ptmx))
A little explanation is probably in order, but see man ps
, man lsof
and (especially) man pts
for information.
/dev/ptmx
is a pseudo-tty master (on modern linux systems, and some other unix(-like) systems). A program will have one of these open if it is a terminal emulator, a telnet/ssh daemon, or some other program which needs a captive terminal (screen
, for example). The emulator writes to the pseudo-tty master what it wants to "type", and reads the result from the pseudo-tty slave.
/proc/$$/fd/0
is stdin of process $$
(i.e. the shell in which the command is executed). If stdin has not been redirected, this will be a symlink to some slave pseudotty, /dev/pts/#. That is the other side of the /dev/ptmx device, and consequently all of the programs listed above which have /dev/ptmx
open will also have some /dev/pts/#
slave open as well. (You might think that you could use /dev/stdin
or /dev/fd/0
instead of /proc/$$/fd/0
, but those would be opened by lsof
itself, and consequently would be its stdin; because of the way lsof
is implemented, that won't work.) The -l
option to lsof
causes it to follow symlinks, so that will cause it to show the process which have the same pts open as the current shell.
The -t
option to lsof
causes it to produce "terse" output, consisting only of pids, one per line. The -Fx
options to grep
cause it to match strings, rather than regex, and to force a full line match; the -f FILE
option causes it to accept the strings to match from FILE
(which in this case is a process substitution), one per line.
Finally, ps -ocomm=
prints out the "command" (chopped, by default, to 8 characters) corresponding to a pid.
In short, the command finds a list of terminal emulators and other master similar programs which have a master pseudo-tty, and a list of processes which use the pseudo-tty slave; finds the intersection between the two, and then looks up the command name for whatever results.