Filteraufruf

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.