Le fichier exécutable nommé 'test' est dans $ PATH mais ne s'exécutera pas

13

J'ai un fichier dans $ HOME / bin (avant de demander, oui, il se trouve dans mon chemin) appelé testet j'ai confirmé qu'il peut être exécuté correctement lorsque je l'exécute avec le chemin d'accès complet au fichier. Cependant, j'ai un problème vraiment bizarre quand je ne le fais pas de cette façon. Quand je viens de courir testdans le terminal, il ne fait rien et revient immédiatement. Je sais que ce n'est pas un problème de trouver le fichier pour plusieurs raisons:

  1. Il n'y a aucun message d'erreur. Normalement, si le fichier est introuvable ou ne peut pas être exécuté, un message sera imprimé pour le dire.

  2. L'exécution which testrenvoie toujours le chemin de fichier correct.

  3. Probablement le plus étrange de tous - le script fonctionne bien lorsqu'il est exécuté strace. J'ai essayé d'utiliser stracepour voir si je pouvais comprendre ce qui se passait, mais lorsque je l'ai exécuté strace, cela a fonctionné comme prévu avec 0 problème.

ContronThePanda
la source

Réponses:

45

testest un nom malheureux à utiliser, c'est l' utilitaire standard pour les tests conditionnels . (C'est en fait la même commande que le [in if [ ... ], cela ressemble à une chose syntaxique, mais c'est vraiment juste une commande normale.)

testest également intégré à Bash par exemple, donc l'exécution testne recherche jamais votre binaire depuis le chemin.

bash$ help test | head
test: test [expr]
    Evaluate conditional expression.

    Exits with a status of 0 (true) or 1 (false) depending on
    the evaluation of EXPR.  Expressions may be unary or binary.  
    [...]

test sans argument renvoie simplement 1 (faux).

L'exécution strace testn'implique pas le shell intégré, car n'implémente straceaucun utilitaire lui-même. Il utilise simplement ce qu'il trouve dans votre PATH. Notez que vous avez probablement la norme testdans /bin/testou /usr/bin/test, si cela devait être le premier PATH, straceexécutez-la.

Sur mon Bash, il whichy a aussi une commande externe, donc il n'a pas non plus d'idée sur les builtins. D'un autre côté, la typecommande est intégrée au shell et type testle montrerait test is a shell builtin.

Voir aussi: Pourquoi ne pas utiliser "qui"? Que faut-il utiliser alors?

ilkkachu
la source