Voici la sortie de la ls -all
commande:
-rwxr----- 1 subhrcho dba 3600 Nov 13 17:26 jdev
-rw-r----- 1 subhrcho dba 1566 Nov 13 17:26 jdev-Darwin.conf
-rw-r----- 1 subhrcho dba 347 Mar 6 2009 jdev-debug.boot
-rw-r----- 1 subhrcho dba 821 Nov 13 17:26 jdev-logging-debug.conf
-rw-r----- 1 subhrcho dba 584 Nov 13 17:26 jdev-logging.conf
-rw-r----- 1 subhrcho dba 4717 Jul 31 16:09 jdev.boot
-rw-r----- 1 subhrcho dba 12877 Nov 13 17:26 jdev.common
-rw-r----- 1 subhrcho dba 5047 Dec 6 01:43 jdev.conf
-rwxr-x--- 1 subhrcho dba 28160 Nov 13 16:28 jdev.exe
-rwxr-x--- 1 subhrcho dba 28672 Nov 13 16:28 jdev64.exe
-rwxr-x--- 1 subhrcho dba 28672 Nov 13 16:28 jdev64W.exe
-rwxr-x--- 1 subhrcho dba 28160 Nov 13 16:28 jdevW.exe
Maintenant, quand je viens de l'exécuter, jdev
il exécute une version différente d' Oracle JDveloper que lorsque je l'exécute en tant que ./jdev
..Pourquoi est-ce le cas?
which
utilitaire peut vous dire quel exécutable sera utilisé si aucun chemin n'est donné.type
vérifier ce qui est lancé par une commande particulière. Causewhich
vous montrera juste un binaire quelque part dans le $ PATH, mais il peut être aliasé à absolument un autre binaire.[~] $which zsoelim /usr/bin/zsoelim [~] $ type zsoelim zsoelim is /usr/bin/zsoelim
. Tandis quezsoelim -> soelim
which
n'a aucune chance de trouver, car c'est un binaire autonome qui n'a pas accès à l'environnement shell en cours d'exécution (j'entends par là les alias et les fonctions, pas seulement les variables d'environnement , dont certains sont hérités).Si vous appelez alors une commande sans barre oblique dans son nom dans un shell, elle est recherchée dans les alias, fonctions et dans la liste des chemins fournis dans la
$PATH
variable d'environnement. (notez que vous pouvez avoir le répertoire de travail actuel (spécifié comme.
ou la chaîne vide) ou tout répertoire relatif$PATH
, mais ce n'est pas recommandé pour des raisons de sécurité).S'il y a une barre oblique dans le nom, cela ne se produit pas, le nom est pris comme chemin pour exécuter la commande (bien que certains shells comme
zsh
permettent aux alias ou aux fonctions d'avoir des barres obliques dans leur nom qui auraient alors priorité).Donc, si vous voulez exécuter une commande appelée
foo
qui se trouve dans le répertoire de travail actuel, vous devez trouver un nom qui contient une barre oblique../foo
est le plus évident. Vous pouvez également utiliser le chemin complet, ou../dir/foo
...Pour savoir ce que le shell exécuterait, utilisez la
type
commande. N'utilisez pas lawhich
commande qui ne fait généralement pas ce que vous pensez qu'elle est et qui est un héritagecsh
dont il vaut mieux laisser seul.la source
which
. Voir par exemple unix.stackexchange.com/questions/16693/…Je recommande d'utiliser le «où» intégré de Zsh (mieux que «lequel») pour voir comment et dans quel ordre les alias, les shell intégrés ou quoi que ce soit d'autre seront trouvés afin de $ PATH ;-)
Voici un exemple pour mieux comprendre les choses, comment elles sont choisies:
la source
Bien que cela dépende probablement de votre shell, la règle est généralement:
Si vous fournissez un chemin, relatif ou absolu, ce chemin est utilisé.
./jdev
est un chemin relatif, car.
représente le répertoire courant (en fait,ls -all .
vous donnerait la même chose quels -all
). Si vous le faites/usr/bin/tool/
, vous utilisez un chemin absolu. Dans ces cas, le fichier pointé est exécuté.Si vous ne fournissez pas de chemin, mais simplement un nom, les répertoires dans
$PATH
sont recherchés pour l'outil que vous essayez d'exécuter.Si vous avez un fichier dans le répertoire en cours avec le même nom qu'un fichier dans certains des répertoires
$PATH
et que vous l'exécutez en ajoutant./
son nom, vous exécuterez effectivement un fichier différent.Un autre problème est peut-être que vous vous attendiez
jdev
à exécuter l'exécutable dans le répertoire en cours. À moins que vous ayez changé$PATH
pour l'inclure.
, ce n'est pas quelque chose que vous devriez attendre du tout ...... et ce n'est toujours pas une bonne idée de l'inclure
.
ici, si vous le faites, veuillez au moins le mettre à la fin, afin que le reste$PATH
soit toujours recherché en premier - imaginez simplement que vous êtes sur un répertoire réseau partagé et quelqu'un décide d'y mettre un binaire diabolique carls
, si cela$PATH
commence.
, un simplels -lah
suffira pour attaquer votre système.la source
jdev
seul est également un chemin relatif. La règle est la suivante: s'il ne contient pas de barre oblique, il est recherché dans les alias, les fonctions et$PATH
, sinon, il est recherché directement dans le système de fichiers (bien que certains shells autorisent les alias ou les fonctions avec / dans leur nom, ce qui prendrait alors priorité).