Permissão de script Bash negada & Intérprete ruim

Estou em um Kali Linux 64 bits.

Criei um script python que leva 2 argumentos para iniciar. Não quero digitar sempre os mesmos caminhos 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 quando tento executar o arquivo de script.

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

wtf.sh tem direitos executáveis.

O que está errado?

Resposta

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

 #! /bin bash  

Deve ser:

 #! /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  

Neste caso /usr/bin/env é o executável; consulte man env para obter detalhes.

Apenas /bin se refere a um diretório.

Comentários

  • droga, bobo de mim! Obrigado! Não ' não vi isso …
  • Você pode querer adquirir o hábito de usar #!/bin/sh (ao invés de #!/bin/bash) a menos que você saiba que está usando bash recursos.
  • @ 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 sh quando sei que ' m não usando recursos bash).
  • No terminal Ubuntu, which bash é útil. Isso retorna /bin/bash. No topo do meu script Bash, adiciono #!/bin/bash. Então, quando desejo executar o script Bash, insiro bash foo.sh. Portanto, which sh é usado da mesma maneira. sh foo.sh
  • @ G-Man, no mundo cotidiano há um número infeliz de pessoas que não ' t saber se estão usando recursos do Bash ou não. Em muitos casos, ' é preferível ter um script não executado (porque o Bash é especificado no shebang, mas está ausente) em vez de executar e executar algo inesperado (porque /bin/sh é algo diferente de Bash e há Bashismos despercebidos no script). Veja aqui.

Resposta

É importante notar que se o ponto de montagem no qual o seu script reside tem o atributo “noexec”, então você pode fazer tudo o que quiser e ainda não funcionará, mas invocar o interpretador com o script como um argumento irá (contanto que que, por sua vez, não tenta executar outro script em uma montagem noexec).

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *