hotti: Kürzel erzeugen für CLI-Optionen

hi,

Kommandozeilen-Optionen haben Kürzel:
--name, -n
--vorname, -vo
--verbose, -ve

Während, die Long-Opts (--name) eindeutig vorgegeben sind, ist ein Kürzel (-n) nur dann zulässig, wenn er ebenfalls eindeutig ist, so reicht im Fall --name der erste Buchstabe. Andernfalls müssen solange Buchstaben angehängt werden, bis es eindeutig ist.

Mir gehts um die Ausgabe einer Gebrauchsanweisung anhand der in einer Liste [name, vorname, verbose] vorgegebenen Optionen, also um die Ausgabe einer Liste mit zulässigen Kürzeln.

Kennt jemand einen zweckmäßigen Algorithmus?

MfG

  1. Tach!

    Kennt jemand einen zweckmäßigen Algorithmus?

    Zweckmäßig? Für welchen Zweck genau?

    Allgemein: Kürzel per Hand vergeben und nur für die wichtigsten/häufigsten Paremeter verwenden, die anderen bleiben lang.

    dedlfix.

    1. Tach!

      Kennt jemand einen zweckmäßigen Algorithmus?

      Zweckmäßig? Für welchen Zweck genau?

      Allgemein: Kürzel per Hand vergeben und nur für die wichtigsten/häufigsten Paremeter verwenden, die anderen bleiben lang.

      Die Kürzel sind automatisch verfügbar, das stellt die Lib. Im Prizip gibt es schon einen einfachen Algorithmus in der von mir eingesetzten Library (Getopt::Long), nur halt andersrum:

      Wenn ein Benutzer anstelle Option --verbose die Kurzform -v eingibt, erkennt die Lib, ob das eindeutig passt, anderenfalls meldet die Lib:

      Option v is ambiguous (verbose, vorname)

      Ergo: Es fehlt ein benutzerfreundlicher Vorschlag. Oder eine Gebrauchsanweisung, welche die Liste möglicher Kürzel anhand der gegebenen Long-Opts automatisch ausgibt.

      MfG

      1. Tach!

        Die Kürzel sind automatisch verfügbar, das stellt die Lib. Im Prizip gibt es schon einen einfachen Algorithmus in der von mir eingesetzten Library (Getopt::Long), nur halt andersrum:

        Wenn ein Benutzer anstelle Option --verbose die Kurzform -v eingibt, erkennt die Lib, ob das eindeutig passt, anderenfalls meldet die Lib:

        Dann musst du genau diesen Algorithmus nachbilden/verwenden. Ich würde das ignorieren und nur für die wichtigsten Optionen die Kürzel dokumentieren. Das ist auch eine Frage nach Aufwand und Nutzen. Wem nützt es, für jede kleine Option ein mehr oder weniger intuitives, weil durch eine nicht weiter intelligente Routine erstelltes Kürzel zu haben?

        dedlfix.

        1. Tach!

          Wem nützt es, für jede kleine Option ein mehr oder weniger intuitives, weil durch eine nicht weiter intelligente Routine erstelltes Kürzel zu haben?

          Man kann dabei auch die Zukunft im Auge behalten. Wenn ein weiterer Parameter mit ähnlichem Anfang hinzukommt, ermittelt der automatische Algorithmus andere Kürzel und alle, die das bisherige verwenden, stehen nun im Regen. Deswegen würde ich die langen dokumentieren, die kurzen händisch vergeben und dazufügen und den Automatismus undokumentiert lassen. Das hinder niemanden die automatischen Kürzel zu verwenden, dann aber auf eigene Verantwortung.

          dedlfix.

  2. Moin,

    Kommandozeilen-Optionen haben Kürzel:
    --name, -n
    --vorname, -vo
    --verbose, -ve

    Während, die Long-Opts (--name) eindeutig vorgegeben sind, ist ein Kürzel (-n) nur dann zulässig, wenn er ebenfalls eindeutig ist, so reicht im Fall --name der erste Buchstabe. Andernfalls müssen solange Buchstaben angehängt werden, bis es eindeutig ist.

    wer sagt das? Ich halte das für keine gute Strategie.
    Stattdessen würde ich die Kurzformen besser so wählen, dass sie mnemonisch günstig sind, also etwa -vn für Vorname, -vb für verbose.

    Wobei Kommandozeilenschalter meistens auf englische Begriffe abgestimmt sind; da hätten wir also eher --firstname. Und -schwupp!- sind -n, -f und -v eindeutig. ;-)

    Ciao,
     Martin

    --
    Soziologen sind nützlich, aber keiner will sie haben.
    Bei Informatikern ist es gerade umgekehrt.
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. Mahlzeit,

      wer sagt das? Ich halte das für keine gute Strategie.

      Das sagen viele tausend Programmierer, die für Unix, Linux, Posix entwickeln. Und diese Strategie hat sich seit Jahrzehnten bewährt ;)

      Stattdessen würde ich die Kurzformen besser so wählen, dass sie mnemonisch günstig sind, also etwa -vn für Vorname, -vb für verbose.

      Und damit evtl. gegen den Posix-Standard verstossen? Das halte ich für keine gute Strategie.

      Wobei Kommandozeilenschalter meistens auf englische Begriffe abgestimmt sind; da hätten wir also eher --firstname. Und -schwupp!- sind -n, -f und -v eindeutig. ;-)

      Sind nach Posix bereits vergeben und somit alles andere als eindeutig, wenn du die anders belegst.

      Ob den Programmierer der Posix-Standard interessiert, ist natürlich seine Entscheidung, aber grad wenn Programme in Repos aufgenommen werden sollen, ist das nötig. (Ausser bei Ubuntu, die interessiert kein Standard).

      --
      42
      1. Hi,

        Stattdessen würde ich die Kurzformen besser so wählen, dass sie mnemonisch günstig sind, also etwa -vn für Vorname, -vb für verbose.
        Und damit evtl. gegen den Posix-Standard verstossen?

        mir war bisher nicht bekannt, dass Posix sowas reglementiert. In der aktuellen Fassung der POSIX-Spezifikation sehe ich nur Abschnitt 12, der etwa in die Richtung geht. Dort wird aber eine eventuelle Langform von Kommandozeilen-Argumenten gar nicht erwähnt. Oder ich hab's übersehen.

        Wobei Kommandozeilenschalter meistens auf englische Begriffe abgestimmt sind; da hätten wir also eher --firstname. Und -schwupp!- sind -n, -f und -v eindeutig. ;-)
        Sind nach Posix bereits vergeben ...

        Wie? Wo steht das?

        Ob den Programmierer der Posix-Standard interessiert, ist natürlich seine Entscheidung, aber grad wenn Programme in Repos aufgenommen werden sollen, ist das nötig.

        Ich glaube, das kann man so allgemein nicht sagen. Vor allem im Bereich der Audio/Video-Bearbeitung sind mir schon zahlreiche Tools begegnet, bei denen das von dir angedeutete Muster nicht zutrifft, etwa lame, mplayer/mencoder, ffmpeg. Trotzdem sind sie in den Repos der meisten Distros enthalten.

        (Ausser bei Ubuntu, die interessiert kein Standard).

        Den Eindruck hatte ich auch schon hin und wieder.

        Ciao,
         Martin

        --
        Progress (n.): Process through which USENET evolved from smart people in front of dumb terminals to dumb people in front of smart terminals.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Mahlzeit,

          Wie? Wo steht das?

          Du fragst mich sachen .... Ich geb zu, ich weiss grad keine Quelle, ich kenne aber aus einigen Manpages die Aussage der Änderung von Parameterbezeichnern um Posix-Konform zu werden.

          Ich glaube, das kann man so allgemein nicht sagen. Vor allem im Bereich der Audio/Video-Bearbeitung sind mir schon zahlreiche Tools begegnet, bei denen das von dir angedeutete Muster nicht zutrifft, etwa lame, mplayer/mencoder, ffmpeg. Trotzdem sind sie in den Repos der meisten Distros enthalten.

          Ich gebe zu, ich hab die Richtlinien bei Debian vor vielen Jahren nur mal überflogen. Wurde vielleicht geändert oder ich liege einfach falsch, kann auch sein.

          Ich muss mir echt angewöhnen, in Zukunft mein Wissen aufzufrischen bevor ich mit alten Infos komme ;) Ich hab mir über die Jahre soviel angelesen, dass da vieles sicher schon lange überholt ist.

          --
          42
          1. Wie? Wo steht das?
            Du fragst mich sachen ....

            Soweit ich erinnere – nein, ich bin auch nicht sicher – sind die Langform-Optionen eine Erweiterung des GNU-Projektes. Die GNU Coding Standards scheinen mich da zu bestätigen. Die haben auch eine Tabelle der gebräuchlichen Optionen, manchmal mit zugehörigen Einzeichen-Optionen.

  3. Mahlzeit,

    Kommandozeilen-Optionen haben Kürzel:
    --name, -n
    --vorname, -vo
    --verbose, -ve

    Nur nebenbei, nach Posix ist -n bereits vergeben und verbose ist -v
    Es hilft Anwendern, sich an solche Standards zu halten ;)
    Und da du in Perl programmierst, was auf allen Plattformen eingesetzt werden kann, ist das IMO doppelt relevant.

    Kennt jemand einen zweckmäßigen Algorithmus?

    Auch wenn ich den Sinn in deinem Anliegen nicht verstehe (es gibt da einige Standards, die das unnötig machen), du nimmst einfach ein Kürzel und durchläufst alle anderen. Dabei prüfst du auf Gleichheit. Wenn es eine Übereinstimmung gibt, schreibst du eine Hash-Tabelle (oder du schreibst rein, wenn es keine gibt ;))

    --
    42
    1. Mahlzeit,

      Kommandozeilen-Optionen haben Kürzel:
      --name, -n
      --vorname, -vo
      --verbose, -ve

      Nur nebenbei, nach Posix ist -n bereits vergeben und verbose ist -v

      Nurmalso nebenbei, das da oben ist ein Beispiel.

      Auch wenn ich den Sinn in deinem Anliegen nicht verstehe

      Die Ausgabe einer man page example automatisieren aus einem eigens entwickelten CLI Auch nur ein Beispiel heraus.

      Ich werde das jetzt einfach so machen, dass ich die Küzel in

        
              # declare opts  
              $self->{OPTS} = {  
                  date => {type => 's', descr => "Datum, Format T.M.J oder T.M.-J (BC)"},  
              };  
      
      

      händisch als zusätzlichen Key eintrage. Dann haben wir ja alles, was wir für die Ausgabe einer man page brauchen.

      MfG

      1. Mahlzeit,

        Nurmalso nebenbei, das da oben ist ein Beispiel.

        Ok, dann kannst du meine Aussage ignorieren ;)

        Die Ausgabe einer man page example automatisieren aus einem eigens entwickelten CLI Auch nur ein Beispiel heraus.

        Ich erzähl dir jetzt mal, wieso ich das nicht machen würde. Nehmen wir an, du schreibst ein CLI-Tool. Ich nutze es und automatisiere es per Bash-Script.

        Jetzt bin ich ne faule Sau und nutze die kurzen Paramater, soweit sie verfügbar sind. Jetzt implementierst du einen neuen Parameter der sich mit einem vorhandenen Kürzel überschneidet.
        Dein Script meckert das zwar an, aber erstmal funktioniert mein Script nicht mehr und ich muss nach Fehlern suchen.

        Wenn du also nur eine eindeutige Kurzform und eine Langform bereitstellst, kann das nicht passieren. Deshalb halte ich das nicht für sinnvoll ;) Aber, wie alles, ist das Geschmacksache.

        --
        42
        1. Mahlzeit,

          Ich erzähl dir jetzt mal, wieso ich das nicht machen würde. Nehmen wir an, du schreibst ein CLI-Tool. Ich nutze es und automatisiere es per Bash-Script.
          Jetzt bin ich ne faule Sau und nutze die kurzen Paramater,

          STOP ;)
          Die kurzen Opts sind für kurze Hacks auf der Konsole gedacht. Wenn Ich was automatisiere, z.B. in eine Bash oder Crontab eintrage, da nutze ich die langen Options. Weil: Ich da relativ sicher sein kann, dass die sich nicht ändern und außerdem besser verständlich sind.

          soweit sie verfügbar sind. Jetzt implementierst du einen neuen Parameter der sich mit einem vorhandenen Kürzel überschneidet.

          Ne, hier ist der Denkfehler: Ein neuer Parameter (Option) wird ausgeheckt. Als was? Als: Long-Option. Da ist eine Überschneidung ausgeschlossen.

          Dein Script meckert das zwar an, aber erstmal funktioniert mein Script nicht mehr und ich muss nach Fehlern suchen.

          Ok, ok, schiefgehen kann alles irgendwann mal...

          Wenn du also nur eine eindeutige Kurzform und eine Langform bereitstellst, kann das nicht passieren.

          Es geht einfacher: Weil nur die Langform bereitgestellt wird und die ist eindeutig. Die Kurzform ergibt sich aus der vorgegebenen Langform, das stellt die Lib Getopt::Long sicher.

          Deshalb halte ich das nicht für sinnvoll ;) Aber, wie alles, ist das Geschmacksache.

          Die library Getopt::Long akzeptiert eine Kurzform, wenn sie eindeutig ist. Ich halte es für sinnvoll, mögliche Kurzformen auch auf der man page auszugeben, das ist benutzerfreundlicher als dass sich ein Benutzer selbst die Kurzform erarbeitet.

          Die Idee, eine man page automatisch aus der Konfiguration heraus zu erzeugen, ist uralt (Stichwort faue Sau).
          Updated: $self->manpage() ;)

          Schön' Ahmd ;)

          1. Mahlzeit,

            Wenn Ich was automatisiere, z.B. in eine Bash oder Crontab eintrage, da nutze ich die langen Options. Weil: Ich da relativ sicher sein kann, dass die sich nicht ändern und außerdem besser verständlich sind.

            Du schon. Aber der gemeine Programmierer ist eben stinkfaul ;)
            Wenn er das nicht wäre, könnte er keinen kurzen und effektiven Code schreiben.
            Und genau das musst du in deinem Programm berücksichtigen. Ist ein Erfahrungswert, den ich einbringen will. Kommt ja auch auf deine Zielgruppe an, die mit dem Programm arbeitet.

            --
            42
            1. Mahlzeit,

              Wenn Ich was automatisiere, z.B. in eine Bash oder Crontab eintrage, da nutze ich die langen Options. Weil: Ich da relativ sicher sein kann, dass die sich nicht ändern und außerdem besser verständlich sind.

              Du schon. Aber der gemeine Programmierer ist eben stinkfaul ;)
              Wenn er das nicht wäre, könnte er keinen kurzen und effektiven Code schreiben.

              Mach ich doch :)
              Abkürzungen nicht von Hand eintragen, sondern automatisch erstellen lassen vom Programm selbst. Btw., ich kann mich an eine c-Unterrichtsstunde im Jahr 1995 erinnern, da haben wir mögliche Algorithmen zu genau derselben Aufgabenstellung diskutiert.

              Die faule Ausrede dazu: Ein händisches (humanoides) Erstellen von eindeutigen Abkürzungen ist grundsätzlich fehlerbehaftet. Klare Aussage, habch mir gerne in den Hinterkopf geschoben :)

              Und genau das musst du in deinem Programm berücksichtigen. Ist ein Erfahrungswert, den ich einbringen will. Kommt ja auch auf deine Zielgruppe an, die mit dem Programm arbeitet.

              FullAck! Ein Programm muss idiotensicher sein und heutzutage auch einem Gerichtsurteil standhalten können.

              OLG: Angeklagter, sie haben den User erschossen, warum?
              A: Er wollte mich auf 10T € Schadenersatz verklagen, weil mein Programm angeblich ohne Rückfrage seine ganzen Kundendaten gelöscht hat.
              OLG: Erklären Sie den Begriff 'angeblich'!
              A: User hat angeblich die Option --demo benutzt.
              OLG: Ja, und?
              A: Tatsächlich hat der faule Sack --d eingegeben!
              OLG: Und --d steht für was!?
              A: Delete

              Das Urteil lassen wir mal offen :)

  4. Verdammte Spielerei ;)

      
    #!/usr/bin/perl  
      
    use strict;  
    use warnings;  
    use Data::Dumper;  
      
    # Options  
    my @opts = qw(version verein verbose vname vorname vergleich dateum);  
      
    my %meta = ();  
    # Opts durchgehen und für jede Opt die Stückchen aufsammeln  
    foreach my $opt( @opts ){  
        my $lets = [split '', $opt]; # in Buchstaben splitten  
        my $stub = '';  
        for( my $i = 0; $i < scalar @$lets; $i++){  
            $stub .= $lets->[$i];  
            push @{$meta{$stub}}, $opt;  
        }  
    }  
      
    my %res = ();  
    # In diesem Hash sind nur Einträge interessant, die ein Array-Element haben  
    foreach my $short( sort keys %meta ){  
        next if scalar @{$meta{$short}} > 1;  
        #print "$short => $meta{$short}->[0]\n";  
        # hash umdrehen und den kürzesten Eintrag nehmen, der hat den index 0  
        push @{$res{$meta{$short}->[0]}}, $short;  
    }  
      
    print "Ausgabe der erlaubten Kürzel\n";  
    foreach my $opt( sort keys %res){  
        print "$opt => $res{$opt}->[0]\n";  
    }  
    
    

    Ausgabe der erlaubten Kürzel
    dateum    => d
    verbose   => verb
    verein    => vere
    vergleich => verg
    version   => vers
    vname     => vn
    vorname   => vo

    Getopt::Long entsprechend.

    Schönes Wochenende ;)

    1. Falls das archiviert wird...

      mit bspw.
      my @opts = qw(version verbose verein vergleich);

      ergeben sich die Kürzel
      verbose   => verb
      verein    => vere
      vergleich => verg
      version   => vers

      Es gibt Fälle, wo ein eindeutiger Kürzel nicht erstellt werden kann (wo dann vermutlich auch Getopt::Long nicht richtig arbeitet, aber das habe ich nicht getestet), bspw.:

      --version
      --verbose
      --verein
      --vergleich
      --ver

      im Design der Long-Opts. Mein gestern entworfener Algorithums kann solche Fälle erkennen, hier ist der Fix zur Qualitätssicherung:

        
      if(scalar keys %res != scalar @opts){  
          warn "===\nEs konnten nicht alle Kürzel erstellt werden!\n===";  
      }  
      
      

      Und hier auch.

      1. Es gibt Fälle, wo ein eindeutiger Kürzel nicht erstellt werden kann (wo dann vermutlich auch Getopt::Long nicht richtig arbeitet, aber das habe ich nicht getestet), bspw.:

        --version
        --verbose
        --verein
        --vergleich
        --ver

        im Design der Long-Opts.

        Wieso? Ich würde sagen:

        -vers
        -verb
        -vere
        -verg
        -ver