O arquivo executável chamado 'test' está em $ PATH, mas não será executado

13

Eu tenho um arquivo em $ HOME / bin (antes que você pergunte, sim, ele está no meu caminho) chamado testque eu confirmei que pode ser executado corretamente quando eu o executo com o caminho completo para o arquivo. No entanto, recebo um problema muito estranho quando não o faço dessa maneira. Quando eu apenas corro testno terminal, ele não faz nada e retorna imediatamente. Sei que não se trata de encontrar o arquivo por vários motivos:

  1. Não há nenhuma mensagem de erro. Normalmente, se o arquivo não puder ser encontrado ou não puder ser executado, uma mensagem será impressa dizendo isso.

  2. A execução which testainda retorna o caminho correto do arquivo.

  3. Provavelmente o mais estranho de todos - o script funciona bem quando executado strace. Tentei usar stracepara ver se conseguia descobrir o que estava acontecendo, mas quando o executei strace, funcionou como esperado com 0 problemas.

ContronThePanda
fonte
7
Use type, não which. Consulte Por que não usar "qual"? O que usar então?
Wjandrea

Respostas:

45

testé um nome infeliz para usar, é o utilitário padrão para testes condicionais . (Na verdade, é o mesmo comando que o [in if [ ... ], apenas parece uma coisa sintática, mas é realmente apenas um comando normal.)

testtambém está embutido, por exemplo, no Bash, portanto, executar apenas testnunca pesquisa seu binário no caminho.

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 sem argumentos retorna apenas 1 (falso).

A execução strace testnão envolve o shell incorporado, pois stracenão implementa nenhum utilitário. Ele apenas usa o que encontra no seu PATH. Note que você provavelmente tem o padrão testem /bin/testou /usr/bin/test, então, se isso seria pela primeira vez em PATH, straceiria correr executar isso.

No meu Bash, whichtambém é um comando externo, portanto também não tem uma idéia sobre os componentes internos. Por outro lado, o typecomando está embutido no shell e type testmostraria isso test is a shell builtin.

Veja também: Por que não usar "what"? O que usar então?

ilkkachu
fonte