Różne sposoby wykonywania plików binarnych i skryptów

11

Używam Linuksa od jakiegoś czasu i szukałem pełnego przeglądu tego, ale nie znalazłem.

Po prostu nie zgadzam się ze wszystkimi różnymi sposobami wykonywania skryptów i plików binarnych - to dla mnie wielki bałagan i muszę użyć metody prób i błędów, aby określić, czego powinienem użyć. W przypadku pliku, który jest skryptem lub plikiem binarnym <script/binary>, mogę wymyślić następujące alternatywy:

<script/binary>
. <script/binary>
./<script/binary>
source <script/binary>
sh <script/binary>

(Czy jest więcej?)

Czy ktoś może dać pełny przegląd tego, jakie polecenia działają z jakim rodzajem plików i jaka jest różnica, gdy istnieje wiele opcji?

Dzięki.

Carl
źródło

Odpowiedzi:

7

Poniższe polecenia są takie same, składnik kropkowy oznacza „bieżący katalog”. Aby umożliwić wykonanie, pliki muszą mieć uprawnienia do wykonywania:

path/to/binary
./path/to/binary

Zauważ, że jeśli ścieżka nie zawiera ukośnika, jest traktowana jak polecenie (wbudowana powłoka lub program, który jest sprawdzany w $PATHzmiennej środowiskowej).

Poniższe są prawie takie same, wykonują skrypt powłoki (nie binarny!) W bieżącym środowisku powłoki. Niewielka różnica między tymi dwoma liniami są opisane w tej kwestii Unix.SE .

. path/to/script
source path/to/script

Wreszcie wspomniałeś sh script. Ponownie działa to tylko w przypadku skryptów powłoki, a nie plików binarnych. Zasadniczo wykonujesz shprogram z nazwą skryptu jako argumentem. W przypadku shtraktuje ten argument jako skrypt powłoki i wykonuje go.

Aby uzyskać odpowiedzi ograniczone do skryptów powłoki , zobacz Różne sposoby wykonywania skryptu powłoki .

Lekensteyn
źródło
3

Dzięki za cały wkład. Spróbuję teraz odpowiedzieć na własne pytanie i dostarczyć kompletny przewodnik po różnych możliwościach wykonywania skryptów i plików binarnych. Edytuj i komentuj, a my będziemy w stanie wymyślić coś kompletnego i poprawnego. Oto moja sugestia:

Na początek dwa punkty do stwierdzenia:

  • Linux rozróżnia polecenie i ścieżkę . Komenda jest wpisany tylko jak jest na wierszu poleceń i wykona wbudowany lub spowoduje Linux szukać odpowiedniego pliku binarnego lub skryptu na $ PATH.

  • Aby Linux zinterpretował coś jako ścieżkę, musi zawierać co najmniej jeden ukośnik (/). Np ./myScript, ./może wydawać się całkiem zbędny - to nie tylko, aby Linux interpretować go jako ścieżki zamiast polecenia.

Tak więc opcje wykonania pliku binarnego lub skryptu:

Wykonywanie pliku binarnego binary:

$ binary          # when 'binary' is on the PATH, or is a built-in
$ ./binary        # when 'binary' is not on the path but in the current directory
$ /home/me/binary # when 'binary' is not on the PATH, and not in the current dir

Wykonywanie skryptu script:

Plik będzie musiał mieć uprawnienia do wykonywania, chyba że zaznaczono inaczej.

$ script        # execute a script that is on PATH. Will be executed in a new shell.
                # The interpreter to use is determined by the she-bang in the file.
$ ./script      # execute a script that is in the current dir. Otherwise as above.
$ /a/dir/script # when the script is not on the PATH and not in current dir. 
                # Otherwise as above.
$ . script      # execute a script in the current dir. Will be executed in the
                # current shell environment.
$ source script # equivalent to the above *1
$ sh script     # executes 'script' in a new shell *2 (the same goes for 'bash ...',
                # 'zsh ...' etc.). Execute permission not neccessary.

O grze She-Bangs :

Skrypty z she-hukiem (np. #!/bin/sh) W pierwszym wierszu informują, którego interpretatora użyć.

  • Ten interpreter będzie używany, gdy zostanie wykonany przy ./scriptużyciu polecenia lub przy użyciu polecenia: script( scriptmusi znajdować się w ścieżce PATH)
  • Użycie sh scriptzignoruje she-bang i użyje, w tym przypadku, shjako tłumacza
  • Użycie . scriptlub sourcezignoruje she-bang i użyje bieżącego interpretera (ponieważ .lub sourcejest równoważne z wykonaniem każdej linii skryptu w bieżącej powłoce)

Przypisy

* 1: To jest tylko prawie prawda. W bash rzeczywiście są one takie same polecenia, ale podczas używania source, scriptbędą wyszukiwane w $ PATH przed bieżącym katalogu. To bash, ale w powłokach tylko POSIX sourcenie działa, ale .działa. Raczej używaj tego drugiego do przenoszenia.

* 2: tak naprawdę dzieje się tak, że uruchamiamy binarny sh z argumentem „script”, co spowoduje, że „sh” wykona „skrypt” w swojej nowej powłoce

Carl
źródło
2

Oto krótka lista poleceń. Zauważ, że kiedy wspominam PATH, mam na myśli katalogi zawierające programy, o których wie system; znajdziesz te z echo $PATH, a będzie to coś w stylu:/home/mike/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Skrypty

  • Aby wykonać skrypt w bieżącym katalogu roboczym, użyj ./myscript.sh
  • Aby wykonać skrypt na innym pliku, użyj (jeśli jest w bieżącym katalogu roboczym), ./myscript.sh textfile.txt
  • Skrypty można również uruchamiać z argumentami; jak wyjaśniono w Rute (s. 68): myfile.sh dogs cats birdswyświetli, The first argument is: dogs, second argument is: cats, third argument is: birdsponieważ zawartość tego skryptu po shebang jest:echo "The first argument is: $1, second argument is: $2, third argument is: $3"

  • Aby wykonać skrypt w innym katalogu, użyj ~/Scripts/dogs.sh

  • Aby wykonać skrypt, o którym wie system, ponieważ znajduje się on w folderze bin w katalogu domowym (po prostu utwórz go, jeśli go nie ma, ponieważ zostanie automatycznie dodany do ŚCIEŻKI), po prostu użyj scriptname
  • Aby wykonać zainstalowany skrypt, ponownie użyj jego nazwy, ponieważ będzie on znany systemowi, na przykład: get_iplayer

Pliki binarne

  • Aby uruchomić plik binarny, o którym wie system, ponieważ znajduje się on w zmiennej $ PATH, użyj nazwy programu i dowolnych parametrów, na przykład: vlc <stream url to open>
  • Aby przetestować skompilowany plik binarny przed instalacją w / usr / local / bin, lub aby trzymać autonomiczny program z dala od systemu, użyj ~/<folder>/app/myprog

źródło
Dzięki za informacje. Czy to zdanie jest prawidłowe: aby wykonać skrypt lub plik binarny spoza PATH, wystarczy określić jego ścieżkę. Powód ./ jest potrzebny dla skryptu w bieżącej ścieżce, ponieważ po prostu „script.sh” byłby interpretowany jako polecenie, ponieważ brakuje w nim co najmniej jednego ukośnika /.
Carl
„Aby wykonać skrypt, który zainstalowałeś”, co to jest skrypt, który „zainstalowałem”? Czy ten punkt mówi to samo co poprzedni punkt?
Carl
@ Carl - twój pierwszy komentarz jest poprawny, ale nieprawdą jest twierdzenie, że moje dwa ostatnie punkty dotyczące skryptów są takie same. W punkcie 5 sekcji skryptu mówiłem o skryptach, które użytkownik ręcznie dodał do swojego folderu bin w swoim katalogu domowym; w punkcie 6 mówiłem o skryptach, takich jak get_iplayer, które zostały zainstalowane z repozytoriów i jako takie zawsze przechodzą do folderów systemowych, a nie do katalogu domowego użytkownika.
Przepraszam, ale nadal tego nie rozumiem, skrypt w ~ / bin / (który jest w PATH) lub w folderze systemowym (który jest w PATH) - jak może być między nimi różnica? Czy zachowują się inaczej?
Carl
Właśnie rozróżniałem te skrypty, które użytkownik jest właścicielem i dodaje do ~ / bin, i te, które są własnością root w folderach systemowych.