Habe ich eine interaktive Shell?

Oft ist es wichtig zu wissen, ob ein Script im Vordergrund oder im Hintergrund, etwa as cron-job läuft. Wenn nicht, kann man alle interaktiven Aktionen wie Eingaben im Script deaktivieren. Oder wenn sie erforderlich sind, das Script gar nicht erst starten. Letzteres erledigt folgender Code am Anfang eines Scripts:

if [ ! -t 1 ] ; then
  exit 0
fi

Das -t steht für „File Descriptor“ und die 1 für stdout. Man kann natürlich auch einfach nach dem genutzten terminal suchen. Das geht so:

readlink -f /proc/self/fd/0

In einer nicht-interaktiven Shell erscheint hier die pipe zum Prozess der Shell, etwa /proc/489748/fd/pipe:[7387825], wobei die erste Zahl für die Prozess-ID des readlink Befehls steht und die letzte den inode (nicht wirklich interessant). Bei einer interaktiven Shell aber sieht das Ergebnis etwa so aus: /dev/tty1 Das besagt, dass ein interaktives tty (teletype terminal) benutzt wird. Üblicherweise sind tty1 – tty6 die lokalen Terminals (nur-text modus) auf einem Linux-PC und tty7 wird für das grafische Interface benutzt. Wenn man darin eine Shell öffnet, bekommt sie ein ebenfalls interaktives pts (pseudo tty) zugeordnet, etwa /dev/pts/0. Die Zahl deutet 0 auf eine lokale Shell (also keine Verbindung via ssh) hin. Eine Verbindung per ssh hat meist eine höhere Ordnungszahl. (Aber das findet man sowieso besser über die Variable $SSH_TTY heraus. Ist sie gesetzt und entspricht dem Ergebnis des obigen Befehls, dann besteht eine SSH-Verbindung zum genutzten Terminal.) Ist das Ergebnis aber etwa /dev/ttyS0 oder /dev/ttyUSBx oder ähnliches, dann besteht eine serielle Verbindung zum Gerät. Und das kann ja auch interessant sein!

Habe ich eine interaktive Shell?