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

13

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
user36976
fonte

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, os scripts de shell para Linux exigem Bash em vez de Bourne, portanto, isso pode não funcionar, mesmo que seja um script de shell.

Se você usar

./<script>.run

o kernel examina a linha shebang para descobrir qual programa usar para executar o programa. Portanto, isso funciona mesmo que seja um Bash, Perl, Python ou algum outro script.

Portanto, essa é geralmente a maneira preferida de executar um script.

Florian Diesch
fonte
1
Como eu disse no olis resposta: Eu verifiquei o executável eu executar o shebang seu / bin / sh assim seu provavelmente bem, espera doente e ver se alguém tem alguma outra informação e, em seguida, aceitar uma resposta
user36976
7

Contanto que seja um shscript de shell (Dash ou equivalente), não, não há diferença externa.

O problema é .runque 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 cegamente sh, quem sabe o que poderia acontecer. Provavelmente haverá erros, mas poderia acidentalmente executar códigos nocivos antes de chegar tão longe.

Ao chmodexecutá-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.

Oli
fonte
Ah não sabia que obrigado pela resposta, verifiquei apenas o executável eu corro o hash-bang é / bin / sh, então eu acho que é muito bem
user36976
1

Os dois métodos costumam agir da mesma forma, mas são muito diferentes.

sh ./scriptexecuta o shcomando com um argumento ./script, que executa o script fornecido .. mesmo se o script não for realmente umsh script (incorreto)

./scriptexecuta o arquivo fornecido. Faz isso procurando o "shebang" linha para determinar qual comando executar. Se não especificado, ele usa sh(isso os dois métodos agem da mesma maneira às vezes), mas geralmente um intérprete diferente é especificado.

Por exemplo, se filenamecontém 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 linha shebang, os dois serão os mesmos:

$ cat script
echo "This is an sh script"
$ sh ./script
This is an sh script
$ ./script
This is an sh script
dbr
fonte
1

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

#!/bin/bash -e

... e você o executa externamente usando shor bash, essa linha será interpretada como um comentário e ignorada, para que o -eparâmetro (saída em falha) não seja processado. Portanto, considerando o seguinte script:

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

A saída para ./scriptserá apenas "Olá", mas a saída para sh scriptserá Helloseguida porgoodbye , o que provavelmente não foi planejado.

A propósito, é por isso que você sempre deve usar uma set -edeclaração separada (é uma boa ideia - de qualquer maneira, se houver um problema no meio do script, você não quer que ela seja ignorada).

lutzky
fonte
0

Não

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

Pabi
fonte