Roteiro Bash sempre imprime “Command Not Found”

Toda vez que executo um script usando o bash scriptname.sh na linha de comando do Debian, recebo o Command Not found e depois o resultado do script. Portanto, o script funciona, mas há sempre uma instrução Command Not Found impressa na canvas.

Eu estou executando o script da pasta /var .

Aqui está o script:

 #!/bin/bash echo Hello World 

Eu corro isso digitando o seguinte:

 bash testscript.sh 

UPDATE – o problema aparece para as linhas em branco. Cada linha em branco está resultando em um comando não encontrado. Por que isso ocorreria?

Certifique-se de que sua primeira linha é:

 #!/bin/bash 

Digite seu caminho para bash se não for /bin/bash


Tente correr:

 dos2unix script.sh 

Isso irá converter os finais de linha, etc do Windows para o formato unix. isto é, retira \ r (CR) dos finais de linha para alterá-los de \r\n (CR+LF) para \n (LF) .

Mais detalhes sobre o comando dos2unix (man page)


Outra maneira de saber se o seu arquivo está no formato DOS / Win:

 cat scriptname.sh | sed 's/\r//' 

A saída será algo como isto:

 #!/bin/sh  echo Hello World  

Isso produzirá o texto do arquivo inteiro com exibido para cada caractere \r no arquivo.

Você pode usar o bash -x scriptname.sh para rastreá-lo.

Eu também me deparei com um problema semelhante. O problema parece ser permissions. Se você fizer um ls -l , poderá identificar que seu arquivo NÃO pode ter o bit de execução ativado. Isso NÃO permitirá que o script seja executado. 🙂

Como @artooro adicionado no comentário:

Para corrigir esse problema, execute chmod +x testscript.sh

Se o script faz seu trabalho (relativamente) bem, então está funcionando bem. Seu problema é provavelmente uma única linha no arquivo que faz referência a um programa que não está no caminho, não está instalado, com erros ortocharts ou algo semelhante.

Uma maneira é colocar um set -x no topo do seu script ou executá-lo com bash -x invés de apenas bash – isto irá mostrar as linhas antes de executá-las e você normalmente só precisa olhar a saída do comando imediatamente antes do erro para ver o que está causando o problema

Se, como você diz, são as linhas em branco que causam os problemas, talvez você queira verificar o que está contido nelas. Corre:

 od -xcb testscript.sh 

e certifique-se de que não há caracteres engraçados “invisíveis” como o CTRL-M (retorno de carro) que você pode obter usando um editor do tipo do Windows.

use dos2unix no seu arquivo de script.

Se você tiver o Notepad ++ e receber essa mensagem de erro .sh: “comando não encontrado” ou esta mensagem de erro autoconf “linha 615: ../../autoconf/bin/autom4te: nenhum arquivo ou diretório” .

Em seu Notepad ++, vá em Edit -> EOL Conversion e então confira Macinthos (CR) . Isto irá editar seus arquivos. Eu também encorajo verificar todos os arquivos com este comando, porque em breve tal erro ocorrerá.

para executar que você deve fornecer caminho completo do que por exemplo

 /home/Manuel/mywrittenscript 

Tive o mesmo problema. Infelizmente

 dos2unix winfile.sh bash: dos2unix: command not found 

então eu fiz isso para converter.

  awk '{ sub("\r$", ""); print }' winfile.sh > unixfile.sh 

e depois

 bash unixfile.sh 

Problemas com a execução de scripts também podem estar conectados à formatação incorreta de comandos de várias linhas, por exemplo, se você tiver um caractere de espaço em branco após a quebra de linha “\”. Por exemplo:

 ./run_me.sh \ --with-some parameter 

(observe o espaço extra após “\”) irá causar problemas, mas quando você remover esse espaço, ele funcionará perfeitamente bem.

Isso pode ser trivial e não relacionado à pergunta do OP, mas muitas vezes confundi isso no começo, quando eu estava aprendendo scripts.

 VAR_NAME = $(hostname) echo "the hostname is ${VAR_NAME}" 

Isso produzirá a resposta ‘comando não encontrado’. A maneira correta é eliminar os espaços

 VAR_NAME=$(hostname) 

Eu também estava tendo alguns do Cannot execute command . Tudo parecia correto, mas na verdade eu estava tendo um espaço não quebrável   bem antes do meu comando, o que, claro, era impossível de ser visto a olho nu:

 if [[ "true" ]]; then  highlight --syntax js "var i = 0;" fi 

Que, no Vim, se parecia com:

 if [[ "true" ]]; then highlight --syntax js "var i = 0;" fi 

Só depois de executar a verificação de shellcheck verificador Bash script encontrei o problema.

Adicione o diretório atual (.) Ao PATH para poder executar um script, apenas digitando seu nome, que reside no diretório atual:

 PATH=.:$PATH 

Eu me deparei com isso hoje, copiando distraidamente o prompt de comando $ (antes de uma cadeia de comando) para o script.

No Bash para Windows eu tentei executar incorretamente

 run_me.sh 

sem ./ no começo e recebi o mesmo erro.

Para pessoas com histórico do Windows, o formulário correto parece redundante:

 ./run_me.sh 

Você pode querer atualizar seus arquivos .bashrc e .bash_profile com aliases para reconhecer o comando que está inserindo.

Arquivos .bashrc e .bash_profile são arquivos ocultos provavelmente localizados em sua unidade C: onde você salva seus arquivos de programa.