$PATHwird nur bei der Ausführung von Befehlen abgefragt . Wenn die Shell nach einem auszuführenden Befehl suchen muss, durchsucht $PATHsie die Liste der Verzeichnisse in $PATHund wählt die erste ausführbare Datei (mit einem entsprechenden Ausführungsbit in den Berechtigungen) aus, die dem angegebenen Namen entspricht, und führt sie aus.
Wenn Sie ausführen stat virtualenv, übergeben Sie virtualenvdem statProgramm ein Argument . Vorausgesetzt, dass states in C geschrieben ist, sieht es dann virtualenvals Argument in der Hauptmethode des Programms:
int main(int argc, char** argv)
Das argventhält zwei Elemente: index 0 ist der Befehl, mit dem Sie das Programm selbst aufrufen, also "stat". index 1 ist das erste Befehlszeilenargument, also "virtualenv".
Dies liegt daran, exec()dass Sie bei einer Reihe von Systemaufrufen (schauen Sie in der Manpage nach, wenn Sie neugierig sind) eine Reihe von Befehlszeilenargumenten übergeben können, wenn Sie den aktuellen Prozess durch einen untergeordneten Prozess ersetzen. Die Shell ruft eine Variante von auf exec()und analysiert Ihre Befehlszeile, um zu bestimmen, als welches Befehlszeilenargumentarray übergeben werden soll argv.
Da statnicht bekannt ist, ob es sich bei der von Ihnen angegebenen Datei um eine normale Datei, einen Symlink, einen Hardlink, eine ausführbare Datei oder ein Verzeichnis usw. handelt, wird nicht gesucht $PATH, um sie zu finden. Das übergebene Argument wird so behandelt, als würde es genau angeben, ${PWD}/virtualenvwo ${PWD}es zum Zeitpunkt des statProgrammaufrufs zum aktuellen Arbeitsverzeichnis erweitert wurde. Dies nennt man einen relativen Pfad .
Fast alle Befehle , die relative Pfade für Dateinamen als Argument akzeptieren , nicht suchen $PATH, obwohl ein paar Befehle tun könnte so, wie bashoder sshwenn Sie ihnen sagen , einen Befehl in der Kind - Shell - Umgebung auszuführen. Es hindert keinen beliebigen Befehl daran, eine bestimmte Umgebungsvariable nach der von Ihnen angegebenen Datei abzusuchen, sondern es handelt sich um ein anwendungsspezifisches Verhalten. Es würde überhaupt keinen Sinn machen, nach $PATHrelativen Pfaden zu suchen , da $PATHes sich nur um ausführbare Dateien handelt.