Czy istnieją jakieś rzeczywiste różnice między uruchomieniem skryptu
[sudo] sh ./<script>.run
zamiast
[sudo] chmod +x ./<script>.run
[sudo] ./<script>.run
command-line
chmod
użytkownik36976
źródło
źródło
Tak długo, jak jest to
sh
skrypt powłoki (Dash lub równoważny), nie, nie ma zewnętrznej różnicy.Problem
.run
nie gwarantuje, że tak jest. Może być binarny. Może to być Bash, Python, PHP lub cokolwiek innego; wszystkie mają hash-bang skryptu powłoki. Jeśli ślepo je przeforsujeszsh
, kto wie, co może się zdarzyć. Prawdopodobnie wystąpi błąd, ale może przypadkowo uruchomić szkodliwy kod, zanim dojdzie tak daleko.Przez
chmod
ding go (w celu umożliwienia wykonywania uprawnień bit), a następnie uruchomić go./script.run
, dać mu możliwie najlepszą możliwość prowadzenia. Jeśli jest to skrypt powłoki, jego hash-bang zostanie poprawnie przeanalizowany, a jeśli jest to binarny plik wykonywalny, po prostu uruchomi się natywnie.źródło
Te dwie metody często działają tak samo, ale są bardzo różne.
sh ./script
uruchamiash
polecenie z argumentem./script
, który zdarza się, aby wykonać dany skrypt. nawet jeśli skrypt nie jest tak naprawdęsh
skryptem (zły)./script
wykonuje podany plik. Robi to, szukając linii „shebang” , aby określić, które polecenie należy uruchomić. Jeśli nie jest określony, używash
(to dwie metody działają czasami tak samo), ale często jest określony inny tłumacz.Na przykład jeśli
filename
zawiera następujące elementy:.. następnie te dwa polecenia są bardzo różne:
Jeśli nie ma linii shebang, obie są takie same:
źródło
Jedną ważną różnicą jest to, czy twoja linia hashbanga ma parametry. Na przykład, jeśli skrypt zaczyna się od
... i uruchamiasz go zewnętrznie za pomocą
sh
lubbash
, ten wiersz zostanie zinterpretowany jako komentarz i zignorowany, więc-e
parametr (wyjście po awarii) nie zostanie przetworzony. Biorąc pod uwagę następujący skrypt:Wyjście na
./script
będzie tylko „Hello”, ale wyjściesh script
zostanieHello
następniegoodbye
, który nie został prawdopodobnie przeznaczony.Nawiasem mówiąc, dlatego powinieneś zawsze używać osobnej
set -e
instrukcji (i tak jest to dobry pomysł - częściej, jeśli nie ma problemu w połowie skryptu, nie chcesz, aby był ignorowany).źródło
Nie
[sudo] chmod +x ./<scrupt>.run
sprawia, że skrypt jest wykonywalny, dzięki czemu można go uruchomić./<script>.run
.Dzięki
[sudo] sh ./<script>.run
niemu możesz go uruchomić, nawet jeśli nie jest wykonywalny.źródło