[Linux] Übliche Option für Ausgabe auf stdout?!

Gast #6846021
Lesenswert?

Schönen guten Abend!

Gegeben sei ein (selbstgeschriebenes) Programm, das
Daten aus einer Datei liest, sie verarbeitet und in
eine Zieldatei schreibt. Die Namen von Quell- und
Zieldatei werden wie üblich auf der Kommandozeile
angegeben. Das soll so sein und funktioniert.

Ich hätte jetzt gern die Möglichkeit, die Output-Daten
bei Bedarf auf die Standardausgabe zu schreiben. Gibt
es eine übliche Konvention für die Kommandozeilenoption,
mit der man das einschaltet? Mir fehlen irgendwie die
passenden Suchworte...

Das Ergebnis standardmäßig auf stdout schreiben möchte
ich nicht; das sind Binärdaten, und ich finde es immer
ärgerlich, wenn die Shell ohne Vorwarnung mit Binärdaten
geflutet wird.


Ach so: Sprache ist Pascal, Compiler ist FreePascal,
verwende keine FCL, falls das von Belang sein sollte.


Besten Dank für jeden hilfreichen Hinweis!
#6846059
Lesenswert?

Egon D. schrieb:
> Georg A. schrieb:
>> Als Zieldatei einfach /dev/stdout angeben geht meistens
>
> Grmpf. Oh Gott!

Da nicht für... ;-)

>> oder stattdessen - als Ausgabefile (zB. -o -).
>
> Hmm.
> Dann müsste ich konsequenterweise auch -i für das
> Inputfile verwenden. Geht natürlich auch.

Ja, nein, vielleicht... ich kenne mich mit Pascal nicht aus, unsere 
letzte Begegnung war zu meiner Schulzeit. Aber wenn es da so etwas wie 
"positional arguments" gibt, wie in boost::program_options für C++, oder 
in argparse für Python, dann sollte das kein Thema sein:
1
#!/usr/bin/env python
2
from argparse import ArgumentParser
3

4

5
if __name__ == '__main__':
6
    parser = ArgumentParser(description='command line arguments ;-)')
7
    parser.add_argument('infile', help='input file')
8
    parser.add_argument('outfile', help='output file')
9
    args = parser.parse_args()
10

11
    if args.infile == '-': args.infile = '/dev/stdin'
12
    if args.outfile == '-': args.outfile = '/dev/stdout'
13

14
    ### the rest is just... to actually DO sth ;-)
15
    
16
    counter = 0
17
    with open(args.infile, 'r') as ifh:
18
        with open(args.outfile, 'w') as ofh:
19
            for line in ifh:
20
                if line.strip().lower() == 'q':
21
                    break
22
                else:
23
                    ofh.write('%d: %s\n'%(counter, line.rstrip()))
24
                counter += 1

Dieses Programm kann man wie einen klassischen UNIX-Filter aufrufen:
1
./main.py - -

oder eben mit einem oder zwei Dateinamen. Ohne oder mit zuwenig 
Parametern gibt es hingegen eine übliche "Usage"-Ausgabe aus. HF!
Gast #6846075
Lesenswert?

>> oder stattdessen - als Ausgabefile (zB. -o -).
>
> Dann müsste ich konsequenterweise auch -i für das
> Inputfile verwenden.

Es geht ihm nicht um die Option sondern um das Minuszeichen.  Die 
Spezialdateien /dev/stdin|out gab es früher nicht.  Stattdessen gab es 
die Konvention, dafür den Dateinamen "-" zu nehmen.  Das Programm hat 
das explizit abgefragt und entspr Sonderbehandlung durchgeführt, z.B. 
so:
1
    FILE *fp = strcmp(filename,"-") ? fopen(filename,"w") : stdout;

Diese Konvention hat sich bis heute in vielen Programmen gehalten.
#6846093
Lesenswert?

Egon D. schrieb:
> Das Ergebnis standardmäßig auf stdout schreiben möchte
> ich nicht; das sind Binärdaten, und ich finde es immer
> ärgerlich, wenn die Shell ohne Vorwarnung mit Binärdaten
> geflutet wird.

Einige Programme wie z.B. tar machen das trotzdem, prüfen aber vorher, 
ob stdout an ein Terminal geht und brechen dann automatisch ab.
Wie das in Pascal geht, weiß ich nicht, aber ich gehe davon aus, dass 
dir die Posix-Funktion isatty dort auch zur Verfügung steht. In C würde 
die Überprüfung so aussehen:
1
bool output_is_terminal = isatty(fileno(stdout));
nehmen.
#6846767
Lesenswert?

foobaz schrieb:
> Hmm ja, es sind 1 (stdout) und 2 (stderr).
> Aber dafuer gibt es ja Headerdateien damit mann sich solchen Kleinkram
> nicht merken muss.

Ja, man kann entweder wie gezeigt die Funktion fileno() verwenden, oder 
man nutzt Makros wie STDOUT_FILENO aus unistd.h. Das gilt allerdings für 
C und wird in Pascal sicherlich anders aussehen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren