Devo executar scripts bash de python com 'bash' ou './'?

5

Eu escrevi um script Python que executa alguns scripts bash como este:

cmd = subprocess.Popen(['bash', 'script.sh'])

Dessa forma, ele executa o script, embora eu não tenha definido permissões de execução com chmod . Eu também posso escrever no terminal bash script.sh e funciona da mesma forma. Eu sei que os scripts podem ser executados com a barra de ponto ./ antes deles, assim como ./script.sh .

Então, qual caminho devo usar no meu script Python? Por quê?

    
por answerSeeker 19.03.2017 / 07:29

1 resposta

9

Primeiro, em relação ao ponto em ./script.sh , isso indica que script.sh pode ser encontrado no diretório de trabalho, significa algo como "procurar por script.sh aqui, neste diretório". Isso é conhecido como barra de pontos, e é bem explicado aqui aqui .

Eu vejo três opções:

  1. Se você pretende restringir o arquivo a ser executado apenas se ele estiver no diretório de trabalho atual do usuário quando ele executar seu script Python, use a barra de pontos. No entanto, isso não parece ser a melhor ideia: ele levará a exceções na maioria das vezes.

  2. Se você pretende restringir seu script de shell a ser executado apenas se ele estiver no mesmo diretório que seu script Python, será necessário encontre o diretório do seu script Python e prefixe-o ao nome do seu script.

  3. Se você pretende colocar seu script de shell em outro lugar em seu PATH, não use a barra de pontos.

Agora, enviar "bash" como um argumento para o construtor Popen parece mais uma questão de preferência. Se você não quiser enviá-lo como argumento, você precisará adicionar um shebang ao script de shell, por exemplo #!/bin/bash , e você precisará adicionar permissões de execução a ele. Estas são coisas perfeitamente aceitáveis para fazer.

Uma vantagem de fazer isso dessa forma é se, posteriormente, um mudar o interpretador de shell, não será necessário modificar todas as chamadas para aquele script em quem sabe quantos scripts Python.

E pode-se apenas chamar o script como:

cmd = subprocess.call('script.sh')
# or
cmd = subprocess.call(sdir + 'script.sh')
# Where sdir stands for the script's directory,
# which you would need to find before, as in option #2.

Notas:

Mesmo que o seu script seja executado sem um shebang normalmente (caso em que quase certamente é executado por traço e não por bash em distribuições baseadas no Debian), ao chamá-lo de python como este, ele irá falhar e gerar uma exceção OSError com errno 8 (errno.ENOEXEC).

Se for realmente necessário, use o Popen .

    
por Samuel Santana 19.03.2017 / 08:30