Bourne | Ash |  #!  | find | ARG_MAX | Shells | whatshell | portability | permissions | UUOC | ancient | - | ../Various | HOME
"$@" | echo/printf | set -e | test | tty defs | tty chars | $() vs ) | IFS | using siginfo | nanosleep | line charset | locale


Unprintable ASCII characters and TTYs

What happens when typing special "control sequences" like <ctrl-h>, <ctrl-d> etc.?

For convenience, "^X" means "<Ctrl-X>" in the following (ignoring the fact that you usually might use the lower case x).

About a possible origin of the "^"-notation, see also an article in a.f.c, <62097@bbn.BBN.COM> (local copy).


Some of these combinations are used rather frequently:

In fact you can type all nonprintable ASCII characters with this mechanism.

The above printable representations for these ASCII characters are determined with a simple logic operation by the terminal driver:

    <character code> XOR 0x40


A good illustration for the resulting "mapping" is the manual page ascii(5) from SunOS 5:

     |  0 NUL|  1 SOH|  2 STX|  3 ETX|  4 EOT|  5 ENQ|  6 ACK|  7 BEL|
     |  8 BS |  9 HT | 10 NL | 11 VT | 12 NP | 13 CR | 14 SO | 15 SI |
     | 16 DLE| 17 DC1| 18 DC2| 19 DC3| 20 DC4| 21 NAK| 22 SYN| 23 ETB|
     | 24 CAN| 25 EM | 26 SUB| 27 ESC| 28 FS | 29 GS | 30 RS | 31 US |
      ===============================================================
     | 32 SP | 33  ! | 34  " | 35  # | 36  $ | 37  % | 38  & | 39  ' |
     | 40  ( | 41  ) | 42  * | 43  + | 44  , | 45  - | 46  . | 47  / |
     | 48  0 | 49  1 | 50  2 | 51  3 | 52  4 | 53  5 | 54  6 | 55  7 |
     | 56  8 | 57  9 | 58  : | 59  ; | 60  < | 61  = | 62  > | 63  ? |
      ---------------------------------------------------------------
     | 64  @ | 65  A | 66  B | 67  C | 68  D | 69  E | 70  F | 71  G |
     | 72  H | 73  I | 74  J | 75  K | 76  L | 77  M | 78  N | 79  O |
     | 80  P | 81  Q | 82  R | 83  S | 84  T | 85  U | 86  V | 87  W |
     | 88  X | 89  Y | 90  Z | 91  [ | 92  \ | 93  ] | 94  ^ | 95  _ |
      ---------------------------------------------------------------
     | 96  ` | 97  a | 98  b | 99  c |100  d |101  e |102  f |103  g |
     |104  h |105  i |106  j |107  k |108  l |109  m |110  n |111  o |
     |112  p |113  q |114  r |115  s |116  t |117  u |118  v |119  w |
     |120  x |121  y |122  z |123  { |124  | |125  } |126  ~ |127 DEL|


However, some other combinations are usually immediately processed in the terminal driver itself.
They result in a signal, an EOF or interact with the flow control. See also stty(1).


Last but not least keep in mind:

If you want to type a control character literally (e.g. in an editor), then you need the "lnext" functionality (often ^V per default) in your tty driver. "lnext" is provided by all modern unix flavours.

Most shells change the stty(1) settings themselves. You will notice a different behaviour when putting the tty in a "rawer" mode, e.g. after just typing "cat<Return>".

Some shells interpret <ctrl-v> as "stty lnext" themselves (apparently for reasons of convenience), even if this capability has not been set in your TTY.


2002-06-17, 2006-01-04