Wird `-` nur mit CD verwendet?

45

cd - kann zwischen aktuellem und vorherigem Verzeichnis wechseln.

Es sieht so aus -, als hätte ich schon andere Befehle als Argumente verwendet, obwohl ich mich nicht mehr erinnere, ob -dies dasselbe bedeutet wie mit cd.

Ich fand, dass -das nicht funktioniert ls.

Wird - nur mit CD verwendet?

Tim
quelle
8
Zu beachten ist, dass cdes sich um einen eingebauten Befehl handelt, nicht um einen externen Befehl (und auch nicht um einen einzigen Befehl). cd -ist also ein Shell-Level-Feature.
flauschiger
6
Ich nutze die ganze Zeit git checkout -, um zum vorherigen Zweig zu wechseln
wim
@fluffy: Werden -sie mit anderen eingebauten auf die gleiche Weise verwendet?
Tim
Für einige der Directory-Handling-Builtins wie pushdja. Andernfalls ist die Bedeutung des "vorherigen Verzeichnisses" kein besonders nützlicher Standard.
flauschiger
1
Vielleicht denken Sie an die '~ -' Funktion von bash (die als $ OLDPWD interpretiert wird). Dies kann mit 'ls' in der von Ihnen beschriebenen Weise verwendet werden.
abonet

Antworten:

22

Die Syntaxrichtlinien für POSIX-Dienstprogramme (insbesondere Nr. 13) geben an, dass für Dienstprogramme, von denen ein Dateiname gelesen werden soll, -die Standardeingabe und für Dienstprogramme, in die ein Dateiname geschrieben werden soll, -die Standardausgabe gilt. Kopiert beispielsweise cat somefile -den Inhalt von somefileauf seine Standardausgabe, gefolgt von dem, was er auf seiner Standardeingabe liest.

Diese Richtlinie gilt nicht für den cdBefehl, da keine Datei gelesen oder in eine Datei geschrieben wird. cdmacht etwas anderes: das Argument -bedeutet "das vorherige Verzeichnis". Der Befehl cd -ist äquivalent zu cd "$OLDPWD" && pwd. Dieses Verhalten ist spezifisch für den cdBefehl und für direkt inspirierte Befehle wie pushd.

Beachten Sie, dass dies -ein Operand und keine Option ist. Nur Argumente, die mit -und beginnen, sind nicht gerecht -oder --Optionen. Die Hauptaussage, ein Operand zu sein, ist, dass --seine spezielle Bedeutung nicht beeinflusst wird. Zum Beispiel cd -- -Pändert sich in ein Unterverzeichnis genannt -P, aber cd -- -ist das gleiche wie cd -, es nicht in ein Verzeichnis ändern genannt -. Ebenso cat -- -wird nicht aus einer aufgerufenen Datei -sondern aus der Standardeingabe gelesen .

Gilles 'SO - hör auf böse zu sein'
quelle
46

-ist in den POSIX Utility-Syntaxrichtlinien als Standardeingabe definiert:

Guideline 13:
For utilities that use operands to represent files to be opened for either 
reading or writing, the '-' operand should be used to mean only standard input 
(or standard output when it is clear from context that an output file is being 
specified) or a file named -.

Sie können diese Definition für Dienstprogramme sehen, die mit Dateien zum Lesen oder Schreiben arbeiten. cdgehört nicht zu diesen Dienstprogrammen, daher -folgt cd dieser Richtlinie nicht.

Außerdem hat POSIX -mit cd auch eine eigene Bedeutung :

-
    When a <hyphen> is used as the operand, this shall be equivalent to the 
    command:

    cd "$OLDPWD" && pwd

    which changes to the previous working directory and then writes its name.
cuonglm
quelle
36

cd -ist eigentlich eine Abkürzung für cd "$OLDPWD" && pwd, wobei festgelegt $OLDPWDwird, wann immer Sie Verzeichnisse in das Verzeichnis ändern, in dem Sie sich gerade befanden.

Die Handhabung -hängt von der Anwendung ab. Einige Anwendungen verwenden , -um anzuzeigen STDIN, zum Beispiel grep,awk

Andere Anwendungen können verwendet werden -als Abkürzung für alles , was sie, wie Michaels Antwort gibt an , wählen mit su, -ist eine Abkürzung für--login

Lawrence
quelle
ja in der Tat gibt es keine Regel dafür.
Kiwy
2
@ Kiwy: Bei POSIX gibt es eine Regel dafür, siehe meine Antwort.
Dienstag,
Um genau zu sein, gibt es eine allgemeine Regel, aber es gibt viele Ausnahmen. Es gibt auch viele Befehle, die vor der Regel ausgeführt wurden, oder alte Implementierungen, die nicht aktualisiert wurden, um der Regel zu entsprechen.
Barmar
19

Obwohl Michael erwähnt, dass suund andere Anwendungen -bedeuten können, was auch immer sie wollen (Lesen von stdin ist üblich), verwendet Git auf -ähnliche Weise cdwie , um Zweige zu wechseln.

$ git status
On branch master

$ git checkout foobar
$ git status
On branch foobar

$ git checkout -
$ git status
On branch master
dotancohen
quelle
18

Jedes Programm kann -als Argument verwenden, um zu bedeuten, was immer es will. Ein bekanntes Beispiel ist su, das -als Abkürzung für verwendet --login. Die einzige Konvention, an die ich denken kann, ist, dass Programme, die aus Dateien lesen, häufig "read from stdin"- bedeuten , aber es liegt ganz beim Programm

Michael Mrozek
quelle
Gibt es Standard- oder Nichtstandardkonventionen für die Verwendung spezieller Symbole als Argumente?
Tim
2

Fügen Sie hier meine zwei Cent. Ich verwende '-', um dem ps2pdf-Tool mitzuteilen, dass es von der Standardeingabe lesen soll, wie bereits von mehreren Personen vorgeschlagen:

man -t ls | ps2pdf - ls.pdf

Der obige Einzeiler erstellt eine PDF-Version der Manpage für ls im aktuellen Verzeichnis.
Hoffe, jemand findet es nützlich :).

gacanepa
quelle
2

Hat , wie von Gnouc geantwortet , -eine eigene Bedeutung in cd.

Sie können jedoch das Verhalten -in anderen Programmen mit replizieren ~-. Zum Beispiel:

cd /etc
cd /
ls ~-             #lists the contents of the /etc directory
vim ~-/fstab      #opens the file /etc/fstab in vim
Chirag Bhatia - chirag64
quelle