Die ausführbare Datei 'test' befindet sich in $ PATH, wird jedoch nicht ausgeführt

13

Ich habe eine Datei in $ HOME / bin (bevor Sie fragen, ja, sie befindet sich in meinem Pfad) aufgerufen, testdie ich bestätigt habe und die einwandfrei ausgeführt werden kann, wenn ich sie mit dem vollständigen Pfad zur Datei ausführe. Ich bekomme jedoch ein wirklich seltsames Problem, wenn ich es nicht so laufen lasse. Wenn ich gerade testim Terminal starte, macht es nichts und kehrt sofort zurück. Ich weiß, dass es aus mehreren Gründen nicht darum geht, die Datei zu finden:

  1. Es liegt keine Fehlermeldung vor. Wenn die Datei nicht gefunden oder nicht ausgeführt werden kann, wird normalerweise eine entsprechende Meldung ausgedruckt.

  2. Das Ausführen gibt which testweiterhin den richtigen Dateipfad zurück.

  3. Wahrscheinlich das seltsamste von allen - das Skript funktioniert einwandfrei, wenn es durchlaufen wird strace. Ich habe versucht mit stracezu sehen, ob ich herausfinden kann, was los ist, aber als ich es ausgeführt habe strace, hat es bei 0 Problemen wie erwartet funktioniert.

ContronThePanda
quelle
7
Verwenden Sie typenicht which. Siehe Warum nicht "welche" verwenden? Was ist dann zu verwenden?
wjandrea

Antworten:

45

testist ein unglücklicher Name, der als Standarddienstprogramm für bedingte Tests verwendet wird . (Es ist eigentlich der gleiche Befehl wie der [in if [ ... ], es sieht nur wie eine syntaktische Sache aus, ist aber wirklich nur ein normaler Befehl.)

testist auch in zB Bash integriert, so dass beim Laufen testniemals die Binärdatei vom Pfad abgefragt wird.

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 Ohne Argumente wird nur 1 (false) zurückgegeben.

Das Ausführen strace testbeinhaltet nicht die eingebaute Shell, da stracekeine Dienstprogramme selbst implementiert werden. Es verwendet nur das, was es in Ihrem findet PATH. Beachten Sie, dass Sie wahrscheinlich den Standard haben testin /bin/testoder /usr/bin/test, also wenn das erste in sein würde PATH, stracedass laufen würde laufen.

In meinem Bash whichist es auch ein externer Befehl, daher hat es auch keine Ahnung von eingebauten Funktionen. Andererseits ist der typeBefehl in die Shell integriert und type testwürde dies zeigen test is a shell builtin.

Siehe auch: Warum nicht "welches" verwenden? Was ist dann zu verwenden?

ilkkachu
quelle