EDIT: Sie sind auf HP-UX läuft
Getestet [ -t 0 ]
auf HP-UX und es scheint, für mich zu arbeiten.
/tmp/x.ksh:
#!/bin/ksh
/tmp/y.ksh
/tmp/y.ksh:
#!/bin/ksh
test -t 0 && echo "terminal!"
Lauf /tmp/x.ksh
druckt: Ich habe das folgende Setup verwendet terminal!
Könnten Sie die oben auf Ihrer Plattform bestätigen und/oder bieten eine alternativer Testaufbau, der Ihre Situation besser widerspiegelt? Wird Ihr Skript letztendlich von cron
erzeugt?
EDIT 2
Wenn verzweifelt, und wenn Perl verfügbar ist, definieren:
stdin_ready() {
TIMEOUT=$1; shift
perl -e '
my $rin = "";
vec($rin,fileno(STDIN),1) = 1;
select($rout=$rin, undef, undef, '$TIMEOUT') < 1 && exit 1;
'
}
stdin_ready 1 || 'stdin not ready in 1 second, assuming terminal'
EDIT 3
Bitte beachten Sie, dass das Timeout kann müssen signifikant sein Wenn Ihre Eingabe von sort
, ssh
usw. kommt (all diese Programme können die Pipe mit Ihrem Skript in Sekunden oder Minuten erzeugen und herstellen, bevor Sie irgendwelche Daten darüber erzeugen). Auch die Verwendung eines hohen Timeouts kann Ihr Skript dramatisch benachteiligen, wenn nichts läuft die Eingabe für den Anfang (z. B.
Wenn möglicherweise große Timeouts ein Problem darstellen und Sie die Art und Weise beeinflussen können, in der Ihr Skript aufgerufen wird, dann sollten Sie die Aufrufer dazu zwingen, Ihr Programm explizit anzugeben, ob stdin verwendet werden soll benutzerdefinierte Option oder in der Standard GNU
oder tar
Art und Weise (zB Skript [Optionen [-]] FILE ..., wobei Datei ein Dateiname sein kann, eine -
Standardeingabe oder eine Kombination daraus, und Ihr Skript würde nur Lesen Sie von der Standardeingabe, wenn -
als Parameter übergeben wurden.)
was ist mit Überprüfung der Länge der Argumente? ($ #) Wenn es ein $ 1 gibt, dann schließen Sie daraus eine Lesung ab. Wenn nicht, lesen Sie von stdin ich würde sagen. –
Wenn ich nur könnte! Verwendung: ./script.ksh <-d dest> [-f from_sys] [Datei, Datei1, ..]. Wenn stdin => [file, file1, ..] nicht verarbeitet werden soll, einfach verschoben. Wenn keine stdin => Prozessdatei, verschiebe file1, .. Wenn keine stdin, noch [Datei, Datei1, ..] => Fehler: Benutzer muss einige zur Verarbeitung bereitstellen! –
ExpertNoob, möchten Sie diese Frage möglicherweise als beantwortet markieren. :) – vladr