sh: 1: programa não encontrado

1

Eu escrevi um script para executar arquivos um por um chamando um programa instalado. O mesmo programa está sendo executado no terminal, como procheck abc.pdb , e está funcionando bem. Mas quando eu executo este programa em um script Perl como

#!/usr/bin/perl -w
@proc = glob '*.pdb';

foreach $proc (@proc)

{
     system ('procheck $proc 2.0');
}

Obtendo erro

sh: 1: procheck: not found 
    
por s kumar 09.11.2017 / 10:37

2 respostas

2

Existem duas coisas que podem ser problemas aqui. Primeiro, com a sequência de aspas simples, a variável não é expandida, portanto, a chamada system() vê a string literal procheck $proc 2.0 . Como contém um caractere especial para o shell (o $ ), o Perl executa o comando através do shell, para que o shell tenha a chance de expandi-lo. A menos que seu ambiente contenha a variável proc , isso se expandirá para nada. Mas isso não importa muito, já que o shell nem parece encontrar o programa procheck no PATH . Ele reclama disso.

Se alterarmos as aspas para aspas duplas, a variável será expandida por Perl (que é provavelmente o que você deseja, já que você está usando essa variável no loop). Mas é provável que você receba um aviso do Perl sobre não conseguir encontrar procheck .

A solução para isso é fornecer o caminho completo para o programa ou certificar-se de que ele esteja nos scripts PATH .

Embora se executá-lo em um shell interativo funciona, é possível que procheck seja, na verdade, um alias ou uma função. Se for apenas um executável comum, ele estará no PATH , que deve ser herdado para o Perl e o subshell. Em p.ex. Bash, você poderia usar type -a procheck para ver o que realmente é executado e se há outras alternativas, como um arquivo de disco mascarado atrás de um alias.

Ah, também, se você não precisar do shell ao executar o comando, poderá evitar que o Perl o chame acidentalmente usando o formulário de lista de system e fornecendo os argumentos para o comando como argumentos separados para% código%. Aqui, isso seria system .

    
por 09.11.2017 / 14:01
0

O problema é que você está usando aspas simples.

Tente isso ...

system ("procheck $proc 2.0");
    
por 09.11.2017 / 13:24