El archivo ejecutable llamado 'prueba' está en $ PATH pero no se ejecutará

13

Tengo un archivo en $ HOME / bin (antes de preguntar, sí, está en mi ruta) llamado testque he confirmado que se puede ejecutar bien cuando lo ejecuto con la ruta completa al archivo. Sin embargo, tengo un problema realmente extraño cuando no lo ejecuto de esta manera. Cuando acabo de ejecutar testen la terminal, no hace nada y regresa de inmediato. Sé que no se trata de encontrar el archivo por varias razones:

  1. No hay ningún mensaje de error. Normalmente, si el archivo no se puede encontrar o no se puede ejecutar, se imprimirá un mensaje diciéndolo.

  2. La ejecución which testaún devuelve la ruta de archivo correcta.

  3. Probablemente el más extraño de todos: el script funciona bien cuando se ejecuta strace. Traté de usar stracepara ver si podía descubrir qué estaba pasando, pero cuando lo ejecuté strace, funcionó como se esperaba con 0 problemas.

ContronThePanda
fuente
77
Uso type, no which. Ver ¿Por qué no usar "which"? ¿Qué usar entonces?
wjandrea

Respuestas:

45

testes un nombre desafortunado para usar, es la utilidad estándar para pruebas condicionales . (En realidad, es el mismo comando que [in if [ ... ], solo parece una cosa sintáctica, pero en realidad es solo un comando normal).

testtambién está integrado, por ejemplo, en Bash, por lo que la ejecución testnunca busca tu binario desde la ruta.

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 sin argumentos solo devuelve 1 (falso).

La ejecución strace testno involucra al shell incorporado, ya straceque no implementa ninguna utilidad en sí misma. Simplemente usa lo que encuentra en tu PATH. Tenga en cuenta que probablemente tenga el estándar testen /bin/testo /usr/bin/test, por lo que si eso fuera el primero PATH, straceejecutaría ejecutar eso.

En mi Bash, whichtambién es un comando externo, por lo que tampoco tiene una idea sobre las incorporaciones. Por otro lado, el typecomando está integrado en el shell y type testlo mostraría test is a shell builtin.

Ver también: ¿Por qué no usar "which"? ¿Qué usar entonces?

ilkkachu
fuente