O script Bash imprime “Comando não encontrado” em linhas vazias

111

Cada vez que executo um script usando bash scriptname.sha linha de comando no Debian, obtenho Command Not foundo resultado do script.

O script funciona, mas sempre há uma Command Not Foundinstrução impressa na tela para cada linha vazia. Cada linha em branco resulta em um comando não encontrado.

Estou executando o script da /varpasta.

Aqui está o script:

#!/bin/bash

echo Hello World

Eu o executo digitando o seguinte:

bash testscript.sh

Por que isso ocorreria?

David
fonte
Sério, a rede está cheia de reclamações. Shell é um intérprete muito fraco e coxo. Pouco aqui e ali e ele falha. Você tem que observar até mesmo todos os espaços em branco no script. Meu script estava falhando por causa do caractere de alimentação de linha invisível. Provavelmente, esta é apenas a linguagem de script onde os espaços em branco contam!
Atul
1
Use bash -x scriptname.shpara rastrear o erro. - No meu caso foi um arquivo sh salvo no Windows com VSCode e terminações de linha como "CRLF". No VSCode, no canto inferior direito, você pode alterar o terminador de linha de "CRLF" para "LF". Carregou este arquivo e poderia executá-lo finalmente com bash scriptname.sh.
Kai Noack
Esta é definitivamente uma duplicata de stackoverflow.com/questions/39527571/… mas muitas respostas aqui explicam uma série de outras situações em que você obtém "comando não encontrado" por outros motivos. Os visitantes são aconselhados a ler todas as respostas se o seu problema não for especificamente sobre linhas vazias.
tripleee 01 de

Respostas:

161

Certifique-se de que sua primeira linha seja:

#!/bin/bash

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


Tente executar:

dos2unix script.sh

Isso irá converter terminações de linha, etc, do Windows para o formato Unix. ou seja, remove \ r (CR) das terminações de linha para alterá-las de \r\n (CR+LF)para \n (LF).

Mais detalhes sobre o dos2unixcomando (página de manual)


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

cat scriptname.sh | sed 's/\r/<CR>/'

O resultado será mais ou menos assim:

#!/bin/sh<CR>
<CR>
echo Hello World<CR>
<CR>

Isso produzirá o texto do arquivo inteiro com <CR>exibido para cada \rcaractere no arquivo.

chown
fonte
Isso provavelmente não é necessário, pois ele está executando diretamente com bash scriptname.sh(mas ainda é uma boa prática, é claro).
paxdiablo
1
Olá, #! / Bin / bash é a primeira linha do meu script
David,
1
@chown - tive o mesmo problema no Mac. Eu tropecei neste post. Não tenho certeza se ajudou o OP ou não. Mas sua solução me ajudou.
Prashant,
1
obrigado. Esse era exatamente o problema que eu estava enfrentando. Estas respostas fizeram funcionar.
slayedbylucifer
5
Como você pode escrever uma resposta a uma pergunta de programação enquanto dirige?
Omar Tariq
61

Você pode usar bash -x scriptname.shpara rastreá-lo.

clyfish
fonte
47

Eu também tive um problema semelhante. O problema parece ser as permissões. Se você fizer isso ls -l, poderá identificar que o seu arquivo pode NÃO ter o bit de execução ativado. Isso NÃO permitirá que o script seja executado. :)

Como @artooro adicionou no comentário:

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

Lypso345
fonte
4
Para corrigir esse problema, executechmod +x testscript.sh
artooro
Esta foi a resposta que funcionou para mim, sempre fui informado que eu não tinha permissão, então eu sudo'ed e foi dito comando não encontrado. Não pensei em verificar as permissões.
DiamondDrake
1
Obrigado Lypso345, isso resolveu o problema que eu estava tendo.
ammills01
chmod 777 testscript.sh FTW
GeneCode
16

Isso pode ser trivial e não relacionado à pergunta do OP, mas muitas vezes cometi esse erro no início, quando estava aprendendo a criar scripts

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

Isso produzirá uma resposta 'comando não encontrado'. A forma correta é eliminar os espaços

VAR_NAME=$(hostname)
Altamont
fonte
11

Se o script fizer seu trabalho (relativamente) bem, ele 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, está com erros ortográficos ou algo semelhante.

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

Se, como você diz, é as linhas em branco causando os problemas, você pode querer verificar o que é actaully no -las. Corre:

od -xcb testscript.sh

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

paxdiablo
fonte
+1 para o comando 'od'! Que legal, eu não sabia disso! Obrigado!
chown
11

No Bash para Windows, tentei executar incorretamente

run_me.sh 

sem ./ no início e obteve o mesmo erro.

Para pessoas com plano de fundo do Windows, a forma correta parece redundante:

./run_me.sh
Michael Freidgeim
fonte
8

use dos2unixem seu arquivo de script.

bash-o-logist
fonte
6

para executá-lo, você deve fornecer o caminho completo disso, por exemplo

/home/Manuel/mywrittenscript
Masood Moghini
fonte
Na verdade, o shell não se preocupa com as extensões de arquivo. Não tenho certeza se isso merece ser postado como uma resposta separada.
tripleee
é claro que .in sistema de arquivos linux ao contrário das extensões do Windows são usados ​​apenas como parte do nome e não dizem nada sobre o conteúdo do arquivo. Não devo dizer no meu caso restrição.
Masood Moghini 01 de
6

Se você tiver o Notepad ++ e receber esta mensagem de erro .sh: "command not found" ou esta mensagem de erro autoconf "line 615: ../../autoconf/bin/autom4te: Não existe esse arquivo ou diretório" .

No seu Notepad ++, vá para Editar -> Conversão EOL e verifique Macinthos (CR) . Isso editará seus arquivos. Também aconselho a verificar todos os arquivos com este comando, pois em breve esse erro ocorrerá.

Juniar
fonte
Obrigado por isso. No meu caso, estava executando um script na distro do busybox Linux. Tive o mesmo erro "não encontrado" em todas as linhas vazias em meus scripts. ele também teve problemas com a instrução if / else. mudar o EOL no Notepad ++ para Unix corrigiu isso.
GeneCode
4

Tive o mesmo problema. Infelizmente

dos2unix winfile.sh
bash: dos2unix: command not found

então fiz isso para converter.

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

e depois

bash unixfile.sh
Eugene Cuz
fonte
2

Problemas com a execução de scripts também podem estar relacionados à 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 que o espaço extra após "\") causará problemas, mas quando você remover esse espaço, ele funcionará perfeitamente.

Marek Wysocki
fonte
0

Eu também estava tendo alguns dos Cannot execute command. Tudo parecia correto, mas na verdade eu estava tendo um espaço inquebrável pouco &nbsp;antes do meu comando que era obviamente impossível de detectar a olho nu:

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

Que, no Vim, parecia:

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

Somente depois de executar o verificador de script Bash shellcheck, encontrei o problema.

Stefan van den Akker
fonte
shellcheckestá disponível on-line, mas é claro que você precisa copiar e colar seu script exatamente para ajudar. shellcheck.net
tripleee
0

Corri para isso hoje, copiando distraidamente o prompt de comando do dólar $(antes de uma string de comando) para o script.

CNSKnight
fonte
-1

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

PATH=.:$PATH
Mike Goethals
fonte
1
Isso é considerado uma vulnerabilidade de segurança. NÃO ADICIONE .AO SEU CAMINHO.
gniourf_gniourf
Explicação sobre por que essa "resposta" é uma má ideia: superuser.com/questions/156582/…
jmng
-1

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

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

Kean Amaral
fonte