2016-03-31 3 views
1

Ich habe/usr/bin in meinem PATH und Punkt (Bedeutung aktuelles Verzeichnis) später im PATH. Ich habe ein Programm 'abcxyz' in zwei Verzeichnissen,/var und/someother. Wenn ich in einem Mate-Terminal in/var bin und einen absurden Namen, dgxuznk, eingebe, dann sagt bash: "bash: dgxuznk: command not found", wie Sie es erwarten würden. Wenn ich jetzt einen Link in/usr/bin namens dgxuznk mache, der auf das Programm in/someother verweist, wird das Programm ebenfalls ausgeführt, wie Sie es erwarten würden. Aber wenn ich jetzt diesen Link entferne, heißt es nicht mehr "Befehl nicht gefunden", sondern "bash:/usr/bin/dgxuznk: Keine solche Datei oder Verzeichnis". Es ist so, als ob es sich daran erinnert hätte, wo es zuvor gefunden wurde und erwartet es wieder unter/usr/bin zu finden.Wie kann man Linux anhalten, um die PATH-Suche abzubrechen?

Noch schlimmer, wenn ich jetzt das Programm in/var umbenennen (wo ich bin) zu dgxuznk, und geben Sie "dgxuznk" noch klagt "bash:/usr/bin/dgxuznk: Keine solche Datei oder Verzeichnis" als wenn es nicht über die/usr/bin im PATH kommen kann, um den Punkt zu sehen und im aktuellen Verzeichnis nach dem Programm zu suchen.

Ist das nur in Fedora 19? Wie kann ich es so programmieren, dass es über den/usr/bin im Suchpfad gelangt und den aktuellen Verzeichnispunkt findet?

(Hinweis:., Wenn Sie diesen Fehler reproduzieren wollen - lassen Sie es nicht um das Programm im aktuellen Verzeichnis finden, bis, nachdem er es in/usr/bin gefunden wird)

+1

Setzen Sie '.' nicht in' $ PATH'. Es ist ein Sicherheitsproblem, das darauf wartet, zu passieren. –

Antwort

6

bash hält eine In-Memory-Hash von wo Programme gefunden werden, so dass es nicht jedes Mal, wenn ein Befehl ausgeführt wird, die vollständige Pfadsuche durchlaufen muss. Jede bash Sitzung behält ihren eigenen Hash bei, aber Sie können ihn mit dem integrierten Befehl hash manipulieren. Um zu sehen, was im Hash ist, führe es einfach ohne Argumente aus. Um es zu löschen, verwenden Sie hash -r. In Ihrem Fall möchten Sie nur dgxuznk mit hash -d gdxuznk entfernen.

(Sie könnten fragen, warum bash nicht nur einen Eintrag aus dem Hash entfernt, wenn der Speicherort nicht gefunden wird. Es kann einen guten Grund geben, einen Fehler zu melden, anstatt auf Pfadsuche zurückzufallen, oder es könnte sein ein Fehler oder ein Bereich zu verbessern.)

+0

Vielen Dank, chepner. Ich wusste nicht, dass "Hash" existiert. Aber es ist gleichbedeutend mit Meuterei! Es gibt KEINEN Weg, dass es auf die Ausführung eines Programms verzichten sollte, wenn es in der PATH-Liste ist. Und es ist auch eine falsche Operation, da der Benutzer die Reihenfolge der Verzeichnisse in PATH speziell einrichten kann, um die richtige auszuwählen. Diese Hash-Sache würde das besiegen. Und kommen Sie auch und sagen Sie, es könnte kein Programm finden, wenn es direkt in der Liste ist !! Ich bin verblüfft! Gibt es eine Möglichkeit, es für immer abzuschalten? – Clive

+0

Ich glaube nicht, dass Sie es deaktivieren können, aber Sie können es jedes Mal mit 'hash -r' löschen, wenn Sie' PATH' ändern. "PATH" ist jedoch nicht etwas, das Sie normalerweise während einer Bash-Sitzung ändern müssen. – chepner