Filteraufruf
am 13.03.2006 08:44:41 von Retep Grubanov
Hi,
ich möchte ein Script schreiben, das eine Datei via Filter oder
Command-Line-Argument verarbeitet und wenn keines von beiden zutrifft eine
Default-Datei öffnet.
Aufrufmöglichkeiten:
% cat /etc/hosts |myscript.pl
% myscript.pl /etc/hosts
% myscript.pl
Ich habe was wie ...
if (defined = ) ... versucht aber da bleibt das Script natürlich
stehen und wartet auf Input vom STDIN.
Hat mir jemand eine Lösung oder einen Tipp?
Vielen Dank.
Re: Filteraufruf
am 13.03.2006 09:03:07 von f.ballandt
> if (defined = ) ... versucht aber da bleibt das Script natürlich
> stehen und wartet auf Input vom STDIN.
if defined my$argument=shift
{
....
}
else
{
....
}
Frank
Re: Filteraufruf
am 13.03.2006 09:20:49 von Christian Lackas
* Retep Grubanov [2006-03-13]:
Hallo Retep,
> ich möchte ein Script schreiben, das eine Datei via Filter oder
> Command-Line-Argument verarbeitet und wenn keines von beiden zutrifft
> eine Default-Datei öffnet.
das wäre aber kein unter Unix zu erwartendes Verhalten. Wenn du andere
Filter wie z.B. grep ohne Parameter aufrufst, dann sollten sie
tatsächlich auf Eingaben auf STDIN warten.
> Aufrufmöglichkeiten:
> % cat /etc/hosts |myscript.pl
> % myscript.pl /etc/hosts
> % myscript.pl
>
> if (defined = ) ... versucht aber da bleibt das Script
> natürlich stehen und wartet auf Input vom STDIN.
Du kannst mit select (oder besser IO::Select) prüfen, ob es etwas von
STDIN zu lesen gibt. Oder auch einfach mit -t, ob STDIN noch mit einem
Terminal verbunden ist:
perldoc -f select
perldoc IO::Select
perldoc -f -t
Gruß
Christian
--
Suche Frau mit Auto - Foto vom Auto erwünscht.
http://www.lackas.net/ Perl Delphi Linux MP3 Searchengines Domainchecker
Re: Filteraufruf
am 13.03.2006 09:21:49 von Christian Lackas
* f.ballandt [2006-03-13]:
Hallo Frank,
> > if (defined = ) ... versucht aber da bleibt das Script natürlich
> > stehen und wartet auf Input vom STDIN.
> if defined my$argument=shift
Perl?
Das Problem liegt aber wohl eher darin zu unterscheiden, ob etwas auf
STDIN vorliegt oder nicht.
Gruß
Christian
--
Gott, vergib mir meine Schuld, meine Gläubiger weigern sich
http://www.lackas.net/ Perl Delphi Linux MP3 Searchengines Domainchecker
Re: Filteraufruf
am 13.03.2006 09:44:04 von Retep Grubanov
Hallo Christian
> Du kannst mit select (oder besser IO::Select) prüfen, ob es etwas von
> STDIN zu lesen gibt. Oder auch einfach mit -t, ob STDIN noch mit einem
> Terminal verbunden ist:
>
> perldoc -f select
> perldoc IO::Select
> perldoc -f -t
>
> Gruß
> Christian
>
Kanns noch nicht ganz umsetzen, hier mein unglücklicher Versuch:
if ( -f <> ) # oder if ( -f ) geht auch nicht
{
while (<>)
{
print "pipe: $_";
}
} else
{
open(FH, "/etc/passwd");
while ()
{
print "FH: $_";
}
close(FH);
}
... Retep
Re: Filteraufruf
am 13.03.2006 09:52:58 von Christian Lackas
* Retep Grubanov [2006-03-13]:
Hallo Retep,
> > perldoc -f select
> > perldoc IO::Select
> > perldoc -f -t
> Kanns noch nicht ganz umsetzen, hier mein unglücklicher Versuch:
hast du die Dokumentation gelesen?
> if ( -f <> ) # oder if ( -f ) geht auch nicht
Wer hat das von '-f' gesagt? Mit '-t' testet man auf ein Terminal ('-f'
oben ist ein Parameter für perldoc, um den entsprechenden Abschnitt auf
perlfunc(1) rauszusuchen).
Außerdem hat der <>-Operator hier nichts zu suchen, du willst das direkt
auf eine Filehandle anwenden:
if (-t STDIN) {
print "STDIN ist mit Terminal verbunden\n";
}
Gruß
Christian
--
Man kann alle Pilze essen - aber manche nur einmal.
http://www.lackas.net/ Perl Delphi Linux MP3 Searchengines Domainchecker
Re: Filteraufruf
am 13.03.2006 10:56:58 von Retep Grubanov
Christian Lackas wrote:
> * Retep Grubanov [2006-03-13]:
>
> Hallo Retep,
>
>> > perldoc -f select
>> > perldoc IO::Select
>> > perldoc -f -t
>> Kanns noch nicht ganz umsetzen, hier mein unglücklicher Versuch:
>
> hast du die Dokumentation gelesen?
>
>> if ( -f <> ) # oder if ( -f ) geht auch nicht
>
> Wer hat das von '-f' gesagt? Mit '-t' testet man auf ein Terminal ('-f'
> oben ist ein Parameter für perldoc, um den entsprechenden Abschnitt auf
> perlfunc(1) rauszusuchen).
> Außerdem hat der <>-Operator hier nichts zu suchen, du willst das direkt
> auf eine Filehandle anwenden:
>
> if (-t STDIN) {
> print "STDIN ist mit Terminal verbunden\n";
> }
>
> Gruß
> Christian
>
>
Vielen Dank, Christian. Das mit dem -f ist natürlich ein blöder
Flüchtigkeitsfehler.
Ich habe es nun mit dem "if (-t STDIN) {}" getestet und stelle fest, dass
wenn ich mein Script über eine Pipe füttere der Test mit -t nicht
funktioniert.
Aufrufe:
% myscript.pl -> geht in den else-Zweig => ok
% myscript.pl /etc/hosts -> geht in den if-Zweig => ok
% cat /etc/hosts | myscript.pl -> geht in den else-Zweig => nicht ok
Re: Filteraufruf
am 13.03.2006 11:07:42 von Christian Lackas
* Retep Grubanov [2006-03-13]:
Hallo Retep,
> Ich habe es nun mit dem "if (-t STDIN) {}" getestet und stelle fest, dass
> wenn ich mein Script über eine Pipe füttere der Test mit -t nicht
> funktioniert.
> Aufrufe:
> % myscript.pl -> geht in den else-Zweig => ok
> % myscript.pl /etc/hosts -> geht in den if-Zweig => ok
> % cat /etc/hosts | myscript.pl -> geht in den else-Zweig => nicht ok
ohne Code kann ich das hier nicht nachvollziehen. Jedenfalls sollten
Fall 1 & 2 ein TTY melden, Fall 3 nicht. Fall 1 und zwei unterscheiden
sich aber durch die Angabe eines Parameters. Folglich solltest du sowas
bauen:
use constant DEFAUL_FILE => '/etc/passwd';
sub read_in { open my $fh, shift or die $!; do{local$/;<$fh>} }
my $data;
if (@ARGV) { # Parameter vorhanden
$data = read_in(shift);
} elsif (-t STDIN) { # kein Parameter, aber Terminal
$data = read_in(DEFAUL_FILE);
} else { # Keine Parameter, aber vermutlich pipe
$data = join'',<>;
}
print $data;
Und schau dir bitte auch mal
http://sial.org/code/shell/tips/useless-cat/
an. Danke.
--
Ja, es gibt gute Menschen. Man muß uns nur entdecken.
http://www.lackas.net/ Perl Delphi Linux MP3 Searchengines Domainchecker
Re: Filteraufruf
am 13.03.2006 13:19:59 von Retep Grubanov
Christian Lackas wrote:
> * Retep Grubanov [2006-03-13]:
>
> Hallo Retep,
>
>> Ich habe es nun mit dem "if (-t STDIN) {}" getestet und stelle fest, dass
>> wenn ich mein Script über eine Pipe füttere der Test mit -t nicht
>> funktioniert.
>> Aufrufe:
>> % myscript.pl -> geht in den else-Zweig => ok
>> % myscript.pl /etc/hosts -> geht in den if-Zweig => ok
>> % cat /etc/hosts | myscript.pl -> geht in den else-Zweig => nicht ok
>
> ohne Code kann ich das hier nicht nachvollziehen. Jedenfalls sollten
> Fall 1 & 2 ein TTY melden, Fall 3 nicht. Fall 1 und zwei unterscheiden
> sich aber durch die Angabe eines Parameters. Folglich solltest du sowas
> bauen:
>
> use constant DEFAUL_FILE => '/etc/passwd';
> sub read_in { open my $fh, shift or die $!; do{local$/;<$fh>} }
> my $data;
> if (@ARGV) { # Parameter vorhanden
> $data = read_in(shift);
> } elsif (-t STDIN) { # kein Parameter, aber Terminal
> $data = read_in(DEFAUL_FILE);
> } else { # Keine Parameter, aber vermutlich pipe
> $data = join'',<>;
> }
> print $data;
>
> Und schau dir bitte auch mal
>
> http://sial.org/code/shell/tips/useless-cat/
>
> an. Danke.
>
>
Genial, genauso wie ich es brauche. Vielen Dank, bin sehr beeindruckt.