Diferença entre + x e ./script e sh ./script

13

Existe alguma diferença real entre executar um script com

[sudo] sh ./<script>.run

em vez de

[sudo] chmod +x ./<script>.run
[sudo] ./<script>.run
    
por user36976 23.06.2014 / 11:21

5 respostas

18

Se você usar

sh ./<script>.run

/bin/sh (geralmente um shell Bourne) será usado para executar o script. É claro que isso só funciona se o script for escrito para o shell Bourne. Às vezes, scripts de shell para Linux requerem Bash em vez de shell Bourne, portanto, isso pode não funcionar mesmo se for um script de shell.

Se você usar

./<script>.run

o kernel analisa a linha shebang para descobrir qual programa usar para executar o programa. Então isso funciona mesmo se for um Bash, Perl, Python ou algum outro script.

Assim, esta é geralmente a maneira preferida de executar um script.

    
por Florian Diesch 23.06.2014 / 11:42
7

Desde que seja um script de shell sh (Dash ou equivalente), não, não há diferença para fora.

O problema é que .run não garante que esse seja o caso. Pode ser binário. Poderia ser Bash ou Python ou PHP ou qualquer outra coisa; todos eles têm um hash-bang de script de shell. Se você cegamente forçá-lo através de sh , quem sabe o que poderia acontecer. Ele provavelmente irá gerar erros, mas pode acidentalmente executar códigos prejudiciais antes de chegar tão longe.

Por chmod ding (para habilitar o bit de permissão de execução) e depois executá-lo ./script.run , você dá a melhor possibilidade possível de execução. Se for um shell script, seu hash-bang será analisado corretamente e se for um executável binário, ele será executado nativamente.

    
por Oli 23.06.2014 / 11:33
1

Os dois métodos podem frequentemente agir da mesma maneira, mas são muito diferentes.

sh ./script executa o comando sh com um argumento ./script , que por acaso executa o script fornecido ... mesmo que o script não seja realmente sh script (bad)

./script executa o arquivo fornecido. Ele faz isso procurando pela linha "shebang" para determinar qual comando executar. Se não for especificado, ele usa sh (os dois métodos agem da mesma forma algumas vezes), mas geralmente um interpretador diferente é especificado.

Por exemplo, se filename contiver o seguinte:

#!/usr/bin/python

print "This is a Python script!"

.. então os dois comandos são muito diferentes:

$ sh script
script: line 3: print: command not found
$ chmod +x script
$ ./script
This is a Python script!

Se não houver uma linha shebang, os dois são os mesmos:

$ cat script
echo "This is an sh script"
$ sh ./script
This is an sh script
$ ./script
This is an sh script
    
por dbr 23.06.2014 / 15:08
1

Uma diferença importante é se a sua linha hashbang tiver parâmetros. Por exemplo, se o script começar com

#!/bin/bash -e

... e você o executa externamente usando sh ou bash , essa linha será interpretada como um comentário e ignorada, portanto, o parâmetro -e (saída na falha) não será processado. Então, dado o seguinte script:

#!/bin/bash -e
echo Hello
false
echo goodbye

A saída para ./script será apenas "Olá", mas a saída para sh script será Hello seguida por goodbye , o que provavelmente não foi pretendido.

Por falar nisso, é por isso que você deve sempre usar uma instrução set -e separada (é uma boa ideia de qualquer maneira - na maioria das vezes, se houver um problema no meio do script, você não quer que ela seja ignorada ).

    
por lutzky 27.06.2014 / 08:47
0

Não

[sudo] chmod +x ./<scrupt>.run torna o script executável para que você possa executá-lo com ./<script>.run .
Com [sudo] sh ./<script>.run você pode executá-lo, mesmo que não seja executável.

    
por Pabi 23.06.2014 / 11:25