Permissão de script Bash negada e intérprete incorreto

8

Estou em um kali linux de 64 bits.

Eu criei um script python que leva 2 argumentos para iniciar. Não quero digitar sempre os mesmos caminhos exatos ou pesquisar no histórico dos comandos que usei no terminal. Então, decidi criar um script simples que chama o script python com seus argumentos.

#! /bin bash

python CreateDB.py ./WtfPath ./NoWtfPath/NewSystem/

É exatamente o mesmo comando que eu usaria no terminal. No entanto, recebo uma mensagem de erro ao tentar executar o arquivo de script.

bash: ./wtf.sh: /bin: bad interpreter: Permission denied

O wtf.sh possui direitos executáveis.

O que está errado?

Davlog
fonte

Respostas:

10

Você tem um espaço em vez de uma barra aqui:

#! /bin bash

Deveria estar:

#! /bin/bash

ou simplesmente

#!/bin/bash

(o primeiro espaço é opcional). O shebang ( #!) deve ser seguido pelo caminho para um executável , que pode ser seguido por um argumento , por exemplo,

#!/usr/bin/env sh

Nesse caso, /usr/bin/envé o executável; veja man envpara detalhes.

Apenas /binse refere a um diretório.

Cachinhos Dourados
fonte
caramba, bobo eu! Obrigado! Não viu que ...
Davlog
1
Você pode adquirir o hábito de usar #!/bin/sh(em vez de #!/bin/bash), a menos que saiba que está usando bashrecursos.
G-Man diz 'Reinstate Monica'
@ G-Man Obrigado por limpar isso um pouco. WRT bash vs. sh, eu estava apenas seguindo o padrão da pergunta (embora minha tendência seja usar apenas shquando eu sei que não estou usando os recursos do bash).
Goldilocks
No terminal Ubuntu, which bashé útil. Isso retorna /bin/bash. Na parte superior do meu script Bash, eu adiciono #!/bin/bash. Então, quando quero executar o script Bash, entro bash foo.sh. Então which shé usado da mesma maneira. sh foo.sh
Nobninja 18/07
1
@ G-Man, no mundo dos dias de trabalho, há um número infeliz de pessoas que não sabem se estão usando os recursos do Bash ou não. Em muitos casos, é preferível que um script não seja executado (porque o Bash é especificado no shebang, mas está ausente), em vez de executar e executar algo inesperado (porque /bin/shé algo que não é o Bash e existem bashismos despercebidos no script). Veja aqui.
Curinga
1

Vale a pena notar que, se o ponto de montagem no qual o script reside possui o atributo 'noexec', você pode mostrar o que deseja e ainda não funcionará, mas chamar o intérprete com o script como argumento (desde que que, por sua vez, não tenta executar outro script em uma montagem noexec).

Splud
fonte