it-swarm.com.de

wo befindet sich `cd`?

In einer Bash-Sub-Shell wird beim Ausführen von cd der folgende Fehler angezeigt

Sudo: cd: command not found

Dies wird erwartet, weil ich keinen Pfad habe. Um dies zu umgehen, gebe ich normalerweise nur den vollständigen Pfad wie folgt an: (/ usr/local/bin/foo)

Zu meiner großen Überraschung scheint cd an keinem der normalen Orte zu sein.

which cd
whereis cd
ls /bin | grep cd

Im Vergleich dazu ist ls genau dort, wo ich es erwarten würde.

which ls
/bin/ls

Wo befindet sich der Befehl cd? Und warum unterscheidet es sich von allen anderen Befehlen?

pdate

Ein weiterer interessanter Leckerbissen, CD, erscheint nicht in hash

hash
0   /bin/ls
2   /usr/bin/find
2   /sbin/ip
1   /usr/bin/updatedb
1   /usr/bin/apt-get
36
spuder

Welche CD benutze ich?

Wenn Sie in Bash sind, ist cd ein eingebautes. Der Befehl type bestätigt dies sogar:

$ type -a cd
cd is a Shell builtin
cd is /usr/bin/cd
cd is /bin/cd

Das System verwendet das erste Element in dieser Liste, daher ist das integrierte Element die bevorzugte Option und die einzige, die funktioniert (siehe den folgenden Abschnitt unter Was ist/bin/cd ).

Was ist ein eingebautes?

Ich stelle mir eingebaute Funktionen gerne als Funktionen vor, die Bash selbst zu tun weiß. Grundsätzlich wurde alles, was Sie häufig verwenden, in den Bash- "Kernel" verschoben, damit nicht jedes Mal ein Prozess ausgeführt werden muss.

Sie können Bash jederzeit explizit mitteilen, dass Sie eine integrierte Funktion verwenden möchten, indem Sie den Befehl builtin wie folgt verwenden:

$ builtin cd

Siehe die Hilfe zu builtin:

$ help builtin

Warum ist CD nicht in Hash?

Der Hash ist nur dazu gedacht, die Speicherorte von Dateien zu "hashen" (auch bekannt als "speichern" in einem Schlüssel/Wert-Paar), nicht für integrierte Funktionen oder Schlüsselwörter. Die Hauptaufgabe für hash besteht darin, zu sparen, dass bei jeder Suche nach häufig verwendeten ausführbaren Dateien der $PATH Durchgesehen werden muss.

Schlüsselwörter?

Dies sind normalerweise die Befehle, die Teil der Programmiersprachenfunktionen von Bash sind.

$ type while
while is a Shell keyword
$ type for
for is a Shell keyword
$ type !
! is a Shell keyword

Einige Dinge werden auf verschiedene Arten implementiert, wie zum Beispiel [:

$ type -a [
[ is a Shell builtin
[ is /usr/bin/[
[ is /bin/[    

... und cd, wie Sie entdeckt haben.

Was ist/bin/cd?

Auf meinem Fedora 19-System ist /bin/cd Eigentlich ein Shell-Skript:

$ more /bin/cd
#!/bin/sh
builtin cd "[email protected]"

Aber es macht nicht das, was du denkst. Weitere Informationen finden Sie in diesen anderen U & L-Fragen und Antworten:

Endeffekt:

POSIX erfordert, dass es vorhanden ist, und in dieser Implementierung fungiert es als Test, der bestätigt, dass Sie Verzeichnisse in X ändern können, und dann einen Rückkehrcode zurückgibt, der bestätigt oder leugnet, dass dies möglich ist.

47
slm

Es ist ein eingebautes. Sehen man bash für die Details von cd und das Bash-Handbuch für eine Beschreibung der eingebauten:

Eingebaute Befehle sind in der Shell selbst enthalten. Wenn der Name eines eingebauten Befehls als erstes Wort eines einfachen Befehls verwendet wird (siehe Einfache Befehle), führt die Shell den Befehl direkt aus, ohne ein anderes Programm aufzurufen. Eingebaute Befehle sind erforderlich, um Funktionen zu implementieren, die mit separaten Dienstprogrammen nicht oder nur ungünstig verfügbar sind.
16
jasonwryan

type und whereis können Ihnen zeigen, dass z.

Für grep:

$ type grep
grep is /bin/grep

Für Chown:

$ whereis chown
chown: /bin/chown /usr/share/man/man2/chown.2.gz /usr/share/man/man1/chown.1.gz

locate kann auch nützlich sein, um verwandte Dateien basierend auf einer Platzhaltersuche anzuzeigen, z. für den Befehl chown:

$ locate chown
/bin/chown
/home/durrantm/.rvm/gems/Ruby-1.9.3-p194/doc/rubyzip-0.9.8/ri/Zip/ZipFileSystem/ZipFsFile/chown-i.ri
/usr/lib/pt_chown
/usr/share/man/man2/fchown32.2.gz
/usr/share/man/man2/fchownat.2.gz
/usr/share/man/man2/lchown.2.gz
/usr/share/man/man2/lchown32.2.gz
/usr/share/zsh/functions/Completion/Unix/_chown

Wenn das Ergebnis ist, dass der Befehl "eingebaut" ist, wie Sie für cd gesehen haben, bedeutet dies, dass sich der Code dafür tatsächlich im Bash-Hauptprogramm befindet und nicht in einem anderen Programm, das sich an anderer Stelle auf der Festplatte befindet.

3
Michael Durrant

Genau wie die internen und externen Befehle von DOS. Einfache Befehle sind in der Shell implementiert (am häufigsten command.com). Komplexere und weniger verwendete Befehle werden in separaten ausführbaren Dateien implementiert, um die Komplexität und den Speicherverbrauch des Befehlsinterpreters zu verringern, die dann externe Befehle sind.

1
phuclv

cd ist eine eingebaute Funktion für Shells, z. bash, csh, ksh.

Es gibt viele integrierte Funktionen, die Shells unterstützen. Sie können sie mit dem Befehl man bash Überprüfen.

1
OmPS

cd ist eine in Shell integrierte Funktion, wie andere bereits erwähnt haben:

$ type cd
cd is a Shell builtin

Dies liegt daran, dass ein Prozess das Arbeitsverzeichnis eines anderen Prozesses nicht ändern kann, ohne ptrace() zu verwenden (was beispielsweise gdb verwendet). Das wäre ein unnötiger Aufwand. Darüber hinaus ist seine Verwendung durch einige Distributionen wie Ubuntu eingeschränkt.

0
nyuszika7h