Warum akzeptiert pwd keine langen Optionen wie --physical?

11

Wenn ich das Handbuch für den pwdBefehl anzeige, heißt es, dass lange Optionen wie --physicalunterstützt werden

$ man pwd
PWD(1)                           User Commands                          PWD(1)

NAME
       pwd - print name of current/working directory

SYNOPSIS
       pwd [OPTION]...

DESCRIPTION
       Print the full filename of the current working directory.

       -L, --logical
              use PWD from environment, even if it contains symlinks

       -P, --physical
              avoid all symlinks

Es schlägt jedoch fehl, wenn ich Folgendes eingebe

$ pwd --physical
-bash: pwd: --: invalid option
pwd: usage: pwd [-LP]

Warum funktionieren lange Optionen bei mir nicht?

Ich benutze RHEL 6.4. Es ist kein Alias ​​für pwd konfiguriert. Sieht aus wie es Standard pwd ist:

$ which pwd
/bin/pwd
Michal Kordas
quelle
1
Die Handbuchseite ist für ein eigenständiges Dienstprogramm gedacht, das nicht Teil von bash ist.
Thomas Dickey
7
Verwenden Sie typestatt which, da whichnur Befehle typeangezeigt werden, während Schlüsselwörter, integrierte Funktionen, Aliase, Funktionen und Befehle (und Hash-Befehlspfade) angezeigt werden. Weitere Informationen finden Sie unter Warum nicht "welche" verwenden? Was ist dann zu verwenden?
Wjandrea
1
In meinem System man pwdhat folgenden Hinweis: your shell may have its own version of pwd, which usually supersedes the version described here. Please refer to your shell's documentation for details about the options it supportsam Ende des DESCRIPTIONAbschnitts.
Nykakin

Antworten:

26

bashhat einen eingebauten Befehl, pwdden Sie verwenden, wenn Sie einfach pwdin Ihre Shell eingeben.

Um das pwdin der Manpage beschriebene zu erhalten, müssen Sie den externen Befehl erzwingen. Sie können dies tun, indem Sie den vollständigen Pfad zur ausführbaren Datei /bin/pwdangeben ( in Ihrem Fall) oder indem Sie envvor die Zeile :: stellen env pwd, wodurch der envBefehl gestartet wird, mit dem der Umgebung Einstellungen hinzugefügt werden können (was hier jedoch nicht erfolgt) und dann envgestartet wird der angegebene Befehl. Da enves kein eingebautes gibt pwd, wird das "echte" /bin/pwdausgeführt.

Der Vorteil der integrierten pwdBash besteht darin, dass bashdas aktuelle Verzeichnis nachverfolgt wird , sodass das Abrufen des Werts kostenlos ist , während der externe Befehl das Dateisystem durchsuchen muss, um den Pfad zu ermitteln, der viel intensiver ist.

wurtel
quelle
4
So funktioniert der externe Befehl eigentlich nicht. unix.stackexchange.com/a/413225/5132
JdeBP
Übrigens: Sie können auch die eingebaute Shell (zumindest in Bash) vonenable -n pwd
derobert
@JdeBP Es war das letzte Mal, dass ich nachgesehen habe (vor langer Zeit :-)); und während jetzt der getcwd()Systemaufruf verwendet wird, durchläuft der Kernel immer noch das Dateisystem, was im Kernelbereich aufgrund des Zugriffs auf relevante Datenstrukturen einfacher ist. In der verknüpften Antwort heißt es: "Beachten Sie jedoch, dass dies auch unter FreeBSD und anderen Betriebssystemen der Fall ist Systeme Der Kernel verfolgt das Arbeitsverzeichnis nicht mit einer Zeichenfolge. "
Wurtel
11

Diese Manpage dokumentiert /bin/pwd, aber wenn Sie ausführen, verwenden pwdSie die integrierte Shell. siehe die Ausgabe von

type pwd

Die integrierte Shell pwdunterstützt keine langen Optionen (siehe Dokumentation Ihrer Shell; da Sie Bash verwenden, help pwdwird eine Zusammenfassung bereitgestellt).

Stephen Kitt
quelle