Terminal input/output

\typein
Synopsis, one of:

\typein{prompt-msg}
\typein[cmd]{prompt-msg}

Print prompt-msg on the terminal and cause LaTeX to stop and wait for you to type a line of input. This line of input ends when you hit the return key.
For example, this

As long as I live I shall never forget \typein{Enter student name:}

coupled with this command line interaction

Enter student name:

\@typein=Aphra Behn

gives the output ‘... never forget Aphra Behn’.
The first command version, \typein{prompt-msg}, causes the input you typed to be processed as if it had been included in the input file in place of the \typein command.
In the second command version the optional argument cmd argument must be a command name — it must begin with a backslash, \. This command name is then defined or redefined to be the input that you typed. For example, this

\typein[\student]{Enter student name:}
\typeout{Recommendation for \student .}

gives this output on the command line,

Enter student name:

\student=John Dee
Recommendation for John Dee.

where the user has entered ‘John Dee.’

\typeout
Synopsis:

\typeout{msg}

Print msg on the terminal and in the log file.
This

\newcommand{\student}{John Dee}
\typeout{Recommendation for \student .}

outputs ‘Recommendation for John Dee’. Like what happens here with \student, commands that are defined with \newcommand or \renewcommand (among others) are replaced by their definitions before being printed.
LaTeX’s usual rules for treating multiple spaces as a single space and ignoring spaces after a command name apply to msg. As above, use the command \space to get a single space, independent of surrounding spaces. Use ^^J to get a newline. Get a percent character with \csname @percentchar\endcsname.
This command can be useful for simple debugging, as here:

\newlength{\jhlength}
\setlength{\jhlength}{5pt}
\typeout{The length is \the\jhlength.}

produces on the command line ‘The length is 5.0pt’.