Differenza tra + x e ./ <script> e sh ./ <script>


13

Esistono differenze effettive tra l'esecuzione di uno script con

[sudo] sh ./<script>.run

invece di

[sudo] chmod +x ./<script>.run
[sudo] ./<script>.run

Risposte:


18

Se usi

sh ./<script>.run

/bin/sh(di solito una shell Bourne) verrà utilizzato per eseguire lo script. Ovviamente questo funziona solo se lo script è scritto per la shell Bourne. A volte gli script di shell per Linux richiedono Bash anziché Bourne shell, quindi potrebbe non funzionare anche se si tratta di uno script di shell.

Se usi

./<script>.run

il kernel guarda la linea shebang per scoprire quale programma usare per eseguirlo. Quindi funziona anche se è un Bash, Perl, Python o qualche altro script.

Quindi questo è di solito il modo preferito per eseguire uno script.


1
Come ho detto in olis answer: ho controllato il file eseguibile, eseguo shebang il suo / bin / sh, quindi probabilmente va bene, aspettate male e vedo se qualcuno ha altre informazioni e poi accetta una risposta
user36976

7

Finché si tratta di uno shscript di shell (tratteggiato o equivalente), no, non vi è alcuna differenza esteriore.

Il problema è .runche non è questo il caso. Potrebbe essere binario. Potrebbe essere Bash o Python o PHP o altro; hanno tutti un hash-bang di script di shell. Se lo costringi ciecamente attraverso sh, chissà cosa potrebbe accadere. Probabilmente andrà in errore ma potrebbe accidentalmente eseguire codice dannoso prima di arrivare così lontano.

Con chmodding esso (per abilitare il bit di permesso di esecuzione) e poi eseguirlo ./script.run, è dare la possibilità migliore possibile di correre. Se è uno script di shell, il suo hash-bang verrà analizzato correttamente e se è un eseguibile binario, verrà eseguito in modo nativo.


Ah, non sapevo che grazie per la risposta, ho appena controllato l'eseguibile, ho eseguito l'hash-bang è / bin / sh, quindi penso che
vada

1

I due metodi possono spesso agire allo stesso modo ma sono molto diversi.

sh ./scriptesegue il shcomando con un argomento ./script, che accade per eseguire lo script dato .. anche se lo script non è in realtà uno shscript (non valido)

./scriptesegue il file indicato. Lo fa cercando la riga "shebang" per determinare quale comando eseguire. Se non specificato utilizza sh(questo a volte i due metodi si comportano allo stesso modo), ma spesso viene specificato un interprete diverso.

Ad esempio, se filenamecontiene quanto segue:

#!/usr/bin/python

print "This is a Python script!"

.. quindi i due comandi sono molto diversi:

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

Se non esiste una linea shebang, i due sono gli stessi:

$ cat script
echo "This is an sh script"
$ sh ./script
This is an sh script
$ ./script
This is an sh script

1

Una differenza importante è se la tua linea hashbang ha parametri. Ad esempio, se lo script inizia con

#!/bin/bash -e

... e lo esegui esternamente utilizzando sho bash, quella riga verrà interpretata come un commento e ignorata, quindi il -eparametro (uscita in caso di errore) non verrà elaborato. Quindi, dato il seguente script:

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

L'output per ./scriptsarà solo "Hello", ma l'output per sh scriptsarà Helloseguito da goodbye, che probabilmente non era previsto.

Questo, a proposito, è il motivo per cui dovresti sempre usare set -eun'istruzione separata (è comunque una buona idea - il più delle volte, se c'è un problema a metà script, non vorrai che venga ignorato).


0

No

[sudo] chmod +x ./<scrupt>.runrende lo script eseguibile in modo da poterlo eseguire con ./<script>.run.
Con [sudo] sh ./<script>.runte puoi eseguirlo, anche se non è eseguibile.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.