Überprüfen Sie in einem Skript, ob die Standardeingabe aus einer Datei oder Pipe stammt

7

Ich weiß, dass dies bisher nur unzureichend behandelt wurde, aber diese Antworten sind entweder nicht erklärbar oder gelten nicht.

Grundsätzlich müssen meine Skripte irgendwann überprüfen, ob eine Datei angegeben ist. Wenn dies der Fall war, wird sie später als Eingabe verwendet.

[ -f "$1" ] && TINPUT="$1"

einfach genug ... Wenn nun eine Datei nicht gefunden oder nicht angegeben wurde, hätte ich TINPUT="-"das, was den späteren Befehl anweisen würde, stdin zu lesen.

Hier ist meine Frage ... Wie kann ich erreichen, dass das Skript fehlerhaft stirbt, wenn es ohne Pipe oder ohne Angabe einer Datei ausgeführt wurde?

Ich verwende dash, die Debian POSIX-kompatible Shell, daher kann ich keine Bashisms verwenden. Ich bevorzuge auch die Verwendung von Listen, ifsaber die meisten ifskönnten trotzdem in Listen geschrieben werden.

JM Becker
quelle
Was meinst du mit "ohne Pfeife"? Wenn kein Dateiname angegeben ist, lesen Sie aus stdin. Was willst du noch?
Gilles 'SO - hör auf böse zu sein'
Meine Frage begann mit 'Hier ist meine Frage ..', was bedeutet, dass der Benutzer das Skript nur selbst ausgeführt hat. Wenn also Daten niemals durch stdin kommen, weil sie überhaupt nicht nach a aufgerufen wurden |. Wenn das konkret ist ist nicht möglich, was meiner Meinung nach möglicherweise nicht möglich ist. Es würde auch ausreichen, nach Daten zu suchen. Grundsätzlich möchte ich, dass das Skript endet und sagt: "Skript benötigt einen Dateinamen oder stdin", anstatt nur ewig ohne Ausgabe zu hängen wie es jetzt tut.
JM Becker

Antworten:

6

Sie können testen, ob der Standardeingang ein Terminal ist:

if [ -n "$1" ]; then
  exec <"$1"
elif tty >/dev/null; then
  echo 1>&2 'Cowardly refusing to read data from a terminal.'
  exit 2
# else we're reading from a file or pipe
fi
Gilles 'SO - hör auf böse zu sein'
quelle
Ich denke, ich kann es von diesem Punkt aus nehmen, danke für Ihre Hilfe.
JM Becker
Feststellend, dass GNU ttyeinen stillen Modus unterstützt : tty -sanstelle vontty > /dev/null
Bischof