4 Stimmen

Was macht der Operator "-" eigentlich in Linux?

Ich sehe die - Operator, der sich bei verschiedenen Befehlen unterschiedlich verhält.

Zum Beispiel,

cd - 

cds in das vorherige Verzeichnis, während,

vim -

liest aus stdin

Ich möchte also wissen, warum die - Der Betreiber verhält sich hier auf 2 verschiedene Arten. Kann mir jemand eine ausführliche Dokumentation über den - Betreiber?

11voto

Benoit Punkte 72929

Es handelt sich nicht um einen Operator, sondern um ein Argument. Wenn Sie ein Programm in C oder C++ schreiben, kommt es als argv[1] (wenn es das erste Argument ist) und Sie können damit machen, was Sie wollen.

Konventionell verwenden viele Programme - als Platzhalter für stdin, wo normalerweise ein Eingabedateiname erforderlich ist, und stdout, wo ein Ausgabedateiname erwartet wird. Aber cd keinen Dateistrom lesen muss, warum sollte es stdin oder stdout benötigen?

Extra: hier unten ist der Auszug aus vim's main.c die Argumente analysiert, die mit - Wenn es kein zusätzliches Zeichen gibt, wird der STDIN-Eingang aktiviert.

    else if (argv[0][0] == '-' && !had_minmin)
    {
        want_argument = FALSE;
        c = argv[0][argv_idx++];
#ifdef VMS
        ...
#endif
        switch (c)
        {
        case NUL:       /* "vim -"  read from stdin */
                /* "ex -" silent mode */
        if (exmode_active)
            silent_mode = TRUE;
        else
        {
            if (parmp->edit_type != EDIT_NONE)
            mainerr(ME_TOO_MANY_ARGS, (char_u *)argv[0]);
            parmp->edit_type = EDIT_STDIN;
            read_cmd_fd = 2;    /* read from stderr instead of stdin */
        }

3voto

Jonathan Leffler Punkte 694013

Der Bindestrich an sich ist ein einfaches Befehlsargument. Seine Bedeutung ist vom Befehl abhängig. Seine beiden häufigsten Bedeutungen sind "Standardeingabe" oder (seltener) "Standardausgabe". Die Bedeutung von "vorheriges Verzeichnis" ist nur für den Befehl cd Shell eingebaut (und das gilt nur für einige Shells, nicht für alle Shells).

cat file1 - file2 | troff ...

Das heißt, lesen file1 , Standardeingabe und file2 in dieser Reihenfolge und senden die Ausgabe an troff .

Ein Extremfall der Verwendung von - für "Standardeingabe" oder "Standardausgabe" stammt von (GNU) tar :

generate_file_list ... |
tar -cf - -T - |
( cd /some/where/else; tar -xf - )

Les -cf - Optionen in der ersten tar bedeuten "ein Archiv erstellen" und "die Ausgabedatei ist die Standardausgabe"; die -T - bedeutet 'die Liste der Dateien und/oder Verzeichnisse von der Standardeingabe lesen'.

Les -xf - Optionen in der zweiten tar bedeutet "ein Archiv extrahieren" und "die Eingabedatei ist die Standardeingabe". In der Tat, GNU tar hat eine Option -C /some/where/else was bedeutet, dass es die cd selbst, so dass der gesamte Befehl sein könnte:

generate_file_list ... |
tar -cf - -T - |
tar -xf - -C /some/where/else

Der Nettoeffekt ist, dass die Dateien kopiert werden, die durch die Option generate_file_list aus dem 'aktuellen Verzeichnis' nach /some/where/else unter Beibehaltung der Verzeichnisstruktur. (Das 'aktuelle Verzeichnis' ist mit einer kleinen Prise Salz zu nehmen; absolute Dateinamen werden von GNU tar - wird der führende Schrägstrich entfernt - und relative Namen werden als relativ zum aktuellen Verzeichnis betrachtet).

1voto

dldnh Punkte 8866

Das hängt von dem Programm ab, in dem es verwendet wird. Für verschiedene Programme bedeutet es etwas anderes.

0voto

Dyno Fu Punkte 8309

Ich denke, verschiedene Programme verwenden unterschiedliche Konventionen. manpages zeigt, wie jedes Programm interpretiert -, hier ist man bash

-
    At shell startup, set to the absolute pathname used to invoke the shell
    or shell script being executed as passed in the environment or argument list.
    Subsequently, expands to the last argument to the previous command, after expansion.
    Also set to the full pathname used to invoke each command executed and placed 
    in the environment exported to that command. When checking mail, this parameter
    holds the name of the mail file currently being checked. 

et man vim

 - The file to edit is read from stdin.  Commands are read from stderr, 
    which should be a tty.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X