#! / bin / bash - nenhum arquivo ou diretório

52

Eu criei um script bash, mas quando tento executá-lo, obtenho

#!/bin/bash no such file or directory

Eu preciso executar o comando: bash script.sh para que ele funcione.

Como posso corrigir isso?

    
por Nicolas de Fontenay 17.12.2011 / 16:25

8 respostas

81

Este tipo de mensagem é geralmente devido a uma falsa linha de shebang, seja um retorno de carro extra no final da primeira linha ou uma lista de materiais no início dele.

Executar:

$ head -1 yourscript | od -c

e veja como termina.

Isso está errado:

0000000   #   !   /   b   i   n   /   b   a   s   h  \r  \n

Isso também está errado:

0000000 357 273 277   #   !   /   b   i   n   /   b   a   s   h  \n

Isso está correto:

0000000   #   !   /   b   i   n   /   b   a   s   h  \n

Use dos2unix (ou sed , tr , awk , perl , python …) para corrigir seu script se esse for o problema.

Aqui está um que removerá os CRs da lista de materiais e da parte traseira:

sed -i '1s/^.*#//;s/\r$//' brokenScript

Observe que o shell que você está usando para executar o script afetará levemente as mensagens de erro exibidas.

Aqui estão três scripts mostrando seu nome ( echo $0 ) e as seguintes linhas de texto:

corretor:

0000000   #   !   /   b   i   n   /   b   a   s   h  \n

scriptWithBom:

0000000 357 273 277   #   !   /   b   i   n   /   b   a   s   h  \n

scriptWithCRLF:

0000000   #   !   /   b   i   n   /   b   a   s   h  \r  \n

No bash, executá-los mostrará estas mensagens:

$ ./correctScript
./correctScript
$ ./scriptWithCRLF
bash: ./scriptWithCRLF: /bin/bash^M: bad interpreter: No such file or directory
$ ./scriptWithBom
./scriptWithBom: line 1: #!/bin/bash: No such file or directory
./scriptWithBom

Executar os falsos explicitamente chamando o interpretador permite que o script CRLF seja executado sem qualquer problema:

$ bash ./scriptWithCRLF
./scriptWithCRLF
$ bash ./scriptWithBom
./scriptWithBom: line 1: #!/bin/bash: No such file or directory
./scriptWithBom

Aqui está o comportamento observado em ksh :

$ ./scriptWithCRLF
ksh: ./scriptWithCRLF: not found [No such file or directory]
$ ./scriptWithBom
./scriptWithBom[1]: #!/bin/bash: not found [No such file or directory]
./scriptWithBom

e abaixo de dash :

$ ./scriptWithCRLF
dash: 2: ./scriptWithCRLF: not found
$ ./scriptWithBom
./scriptWithBom: 1: ./scriptWithBom: #!/bin/bash: not found
./scriptWithBom
    
por 17.12.2011 / 18:09
15

Isso também pode ser causado por uma lista de materiais em um script UTF-8. Se você criar o script no Windows, às vezes, terá algum lixo no início do arquivo.

    
por 17.07.2014 / 18:12
8

Na verdade, o shebang certo para script bash é este:

#!/usr/bin/env bash

Porque, no freeBSD, o bash está localizado em /usr/local/bin/bash

    
por 27.06.2014 / 22:38
6

Você pode usar o vi para corrigir os dois problemas, se existirem:

vi <your_file>
:set ff=unix
:set nobomb
:wq
    
por 31.05.2017 / 22:18
4

Se você não tem dos2unix, esta é uma maneira de corrigir esse problema.

cp script _p4 && tr -d '\r' < _p4 > script && rm _p4
    
por 28.04.2016 / 23:32
4

Marca de ordem de byte (BOM)

Isso pode ser causado por uma lista de materiais. Da Wikipedia, uma lista de materiais é uma

The byte order mark (BOM) is a Unicode character, U+FEFF byte order mark (BOM), whose appearance as a magic number at the start of a text stream can signal several things to a program consuming the text

Infelizmente, não sinaliza nada para o kernel do Linux que lida com a linha she-bang. Você pode verificar se tem uma lista de materiais usando file ,

file /tmp/foo 
/tmp/foo: UTF-8 Unicode (with BOM) text

Ou você pode fazer o hexdump dos primeiros caracteres e ver se eles corresponderem a qualquer um dos caracteres da lista de materiais manualmente

Você pode retirar os caracteres da BOM assim que os conhecer assim,

sed -i '1 s/^\xef\xbb\xbf//' *.txt

Ou usando o VIM com

:set ff=unix
:set nobomb
:wq
    
por 09.03.2017 / 04:12
0

Eu tive o problema acidentalmente adicionando um executável bash errado ao PATH e porque no meu script o mais flexível #!/usr/bin/env bash shebang foi usado (pegue o primeiro executável do caminho).

command -v bash
/cygdrive/c/Program Files/Git/bin//bash

Eu instalei o GIT para Windows para trabalhar em cygwin junto com as GUIs do Windows GIT (não estava funcionando com o git nativa do cygwin ...). Eu resolvi isso agora mudando para #!/bin/bash sheband e removendo o GIT para windows de PATH .

    
por 18.06.2018 / 10:31
-3

Experimente #!/bin/bash

Segunda coisa: find / -name bash
Terceira coisa: ls -al /bin/bash

    
por 17.12.2011 / 16:33