
Warum which
müssen Sie beim Linux-Programm die Shell aktualisieren (z. B. etwas tcsh
in das Terminal eingeben), um die neuen Programme anzuzeigen, die in Ihrem Pfad installiert sind?
Ich war verblüfft, warum ich nicht auf ein Programm zugreifen konnte, das dieselben Berechtigungen wie andere Programme hatte usr/local/bin
, was which
deutlich zu sehen war.
Kann mir jemand in allgemeinverständlicher Sprache erklären, wie das funktioniert?
Antwort1
Versuchenrehash
man tcsh
sagt
rehash Causes the internal hash table of the contents of the directo-
ries in the path variable to be recomputed. This is needed if
new commands are added to directories in path while you are
logged in. This should be necessary only if you add commands
to one of your own directories, or if a systems programmer
changes the contents of one of the system directories. Also
flushes the cache of home directories built by tilde expansion.
Einfach ausgedrückt: tcsh möchte eine schnelle Antwort liefern, also erstellt es eine interne Tabelle (vermutlich eine Hash-Tabelle) mit Befehlen und wo diese zu finden sind. Dies geschieht vermutlich beim Start. Leider verfügt es über keinen Mechanismus, um zu erkennen, wenn Sie oder ein Administrator etwas tun, das eine Aktualisierung dieser Tabelle erforderlich machen würde.
Dies ist einer der vielen Gründe, warum ich ksh oder bash csh-Derivaten vorziehe.
Antwort2
$ which test
/usr/bin/test
$ ls ~/bin/test
ls: cannot access bin/test: No such file or directory
$ touch ~/bin/test
$ chmod 755 ~/bin/test
$ which test
/home/daniel/bin/test
$
Bei Verwendung von Bash ist keine Shell-Aktualisierung erforderlich, daher besteht kein Zusammenhang which
. Es müssen andere Variablen im Spiel sein.