If you work at several kinds of terminals, terminal setup can be tough. For instance, my X terminal sends a backspace character when I push the upper-right key, but the same key on another terminal sends a delete character-I want stty erase (5.9) to set the right erase character automatically. Maybe you want a full set of calendar programs started when you log in to the terminal at your desk, but not when you make a quickie login (2.5) from somewhere else.
Here are some ideas for changing your login sequence automatically. Some examples are for the C shell and use that shell's switch (47.6) and if (47.3). Examples for Bourne-type shells use case (44.5) and if (44.8). If you use the other type of shell, the idea still applies; just switch the syntax.
If all you want to do is initialize your terminal (set the TERM variable (5.10), set your erase character, etc.), the tset (5.3) command may be all you need.
If your TERM environment variable is set differently on each terminal, you can add a test like this to your .login file:
switch ($TERM) case vt100: ...do commands for vt100 breaksw casexxx
: ...do commands for xxx breaksw default: ...do commands for other terminals breaksw endsw
and so on.
If you log in from other hosts (1.33) or from hosts running the X window system (1.31), the who am i command will probably show a hostname and/or window information in parentheses:
bash$who am i
jpeek pts/6 Jul 17 10:30 (www.jpeek.com:0.0)
(Long hostnames may be truncated. Check yours before you write this test.) If the information in parentheses will help, add commands like these to your .profile file:
case \(..\) \1 | case "`who am i | sed -n 's/.*(\(.*\))/\1/p'`" in *0.0) ...do commands for X display 0 ;; mac2*) ...do commands for the host mac2.foo.com ;; "") ...no output (probably not a remote login) ;; *) ...do commands for other situations ;; esac |
---|
That uses
sed (34.24)
to give
the text between the parentheses for that remote host to the case
.
This *0.0
case matches lines ending with 0.0
, the
mac2
case matches lines that start with mac2
,
an empty string means sed probably didn't find any parentheses,
and the *
case catches everything else.
If you know that certain port numbers are used for certain kinds of logins, you can test that. For example, many systems use ttyp0, ttyq1, etc. as network ports for rlogin and telnet (1.33). This test will branch on the port name:
case "`tty`" in /dev/tty[pqrs]?) # rlogin, telnet: ... /dev/tty02) # terminal on my desk: ... "not a tty") ;; ...not a terminal login session; do nothing esac
Certain systems set certain environment variables. For example, the X Window System sets a DISPLAY environment variable. (If you aren't sure about your system, use the env or printenv command (6.1) to look for changes in your environment at different systems.) You can test that:
if $? | if ($?DISPLAY) then # on X window system ... else if ($?WIN_PARENT) then # on SunView system ... else ... endif |
---|
Your system may have a /etc/ttytab or /etc/ttys file that lists the type of each terminal port. Lines in the file look something like this:
console "/usr/etc/getty std.9600" vt100 on local tty00 "/usr/etc/getty std.9600" dialup off local tty01 "/usr/etc/getty std.9600" plugboard off local ... ttyp0 none network off ...
(For example, port ttyp0 is network, the type used by xterm (1.31), telnet (1.33), and so on.)
You can match the output of the
tty (3.8)
command, which shows your current tty, to the first column of that
file.
The output of tty starts with /dev or /dev/pts.
So, to match your current tty to the file, you need to strip the
name to its tail.
For example, in bash and ksh, these three lines would
put the terminal port type (vt100
, plugboard
, etc.)
into the ttykind shell variable:
${..#..} awk | tty=`tty` ttytail=${tty#/dev/} ttykind=`awk '$1 == "'$ttytail'" {print $3}' /etc/ttys` |
---|
You can also deal with many of these cases using the venerable but obscure tset (5.3) program to select and initialize the correct terminal type. Another program you can use to set the terminal type is qterm (5.5), available on the CD-ROM.
-