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?

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.


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).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.