Existem diferenças reais entre executar um script com
[sudo] sh ./<script>.run
ao invés de
[sudo] chmod +x ./<script>.run
[sudo] ./<script>.run
command-line
chmod
user36976
fonte
fonte
Contanto que seja um
sh
script de shell (Dash ou equivalente), não, não há diferença externa.O problema é
.run
que não garante que é o caso. Pode ser binário. Pode ser Bash ou Python ou PHP ou o que for; todos eles têm um script de shell hash-bang. Se você forçar cegamentesh
, quem sabe o que poderia acontecer. Provavelmente haverá erros, mas poderia acidentalmente executar códigos nocivos antes de chegar tão longe.Ao
chmod
executá-lo (para ativar o bit de permissão de execução) e, em seguida, executá-lo./script.run
, você oferece a melhor possibilidade possível de execução. Se for um script de shell, seu hash-bang será analisado corretamente e se for um executável binário, será executado nativamente.fonte
Os dois métodos costumam agir da mesma forma, mas são muito diferentes.
sh ./script
executa osh
comando com um argumento./script
, que executa o script fornecido .. mesmo se o script não for realmente umsh
script (incorreto)./script
executa o arquivo fornecido. Faz isso procurando o "shebang" linha para determinar qual comando executar. Se não especificado, ele usash
(isso os dois métodos agem da mesma maneira às vezes), mas geralmente um intérprete diferente é especificado.Por exemplo, se
filename
contém o seguinte:.. então os dois comandos são muito diferentes:
Se não houver linha shebang, os dois serão os mesmos:
fonte
Uma diferença importante é se a sua linha hashbang possui parâmetros. Por exemplo, se o script começar com
... e você o executa externamente usando
sh
orbash
, essa linha será interpretada como um comentário e ignorada, para que o-e
parâmetro (saída em falha) não seja processado. Portanto, considerando o seguinte script:A saída para
./script
será apenas "Olá", mas a saída parash script
seráHello
seguida porgoodbye
, o que provavelmente não foi planejado.A propósito, é por isso que você sempre deve usar uma
set -e
declaração separada (é uma boa ideia - de qualquer maneira, se houver um problema no meio do script, você não quer que ela seja ignorada).fonte
Não
[sudo] chmod +x ./<scrupt>.run
torna o script executável para que você possa executá-lo./<script>.run
.Com
[sudo] sh ./<script>.run
você pode executá-lo, mesmo que não seja executável.fonte