Kluczowa kwestia jest taka: rozszerzenia nie mają znaczenia w żadnym systemie systemowym podobnym do Uniksa. Nazwa pliku to po prostu nazwa i nie ma wpływu na to, czy skrypt lub skompilowany plik wykonywalny mogą być uruchomione . Programista może dodać .shrozszerzenie, aby oznaczyć, że plik jest skryptem powłoki lub .pyskryptem Pythona, ale w przeciwieństwie do systemu Windows, każdy system uniksowy nie dba o nazewnictwo, dba o uprawnienia.
Liczy się uprawnienie do pliku nadane plikowi. Które możesz sprawdzić
ls -l /path/to/file
Uruchamianie plików wykonywalnych
Aby uruchomić skrypt, jest na ogół kilka sposobów.
- Jeśli twój bieżący katalog jest taki sam jak skrypt, a skrypt ma uprawnienia do wykonywania, możesz go tak uruchomić
./my_script_name. .Oznacza katalog bieżący.
- Jeśli bieżący katalog jest inny, a skrypt ma uprawnienia do wykonywania, możesz go uruchomić, podając pełną ścieżkę:
/home/user/bin/my_script_name
(Dwie powyższe metody polegają na ustawieniu uprawnień do wykonywania; nie $PATHma znaczenia , czy plik jest częścią zmiennej. Nie ma znaczenia również obecność #!linii; bez niej skrypt zostanie wykonany przez otwartą powłokę, którą otworzyłeś. Jeśli mam cshskrypt) bez tej linii i spróbuj uruchomić ją bash z ./my_script.csh, to się nie powiedzie)
- Jeśli twój skrypt znajduje się w katalogu, który jest częścią
$PATHzmiennej, możesz go uruchomić, wywołując nazwę. Możesz wywołać chmodpolecenie w wierszu polecenia, wpisując jego nazwę, ponieważ znajduje się w /binfolderze. /binjest zawsze częścią $PATHzmiennej. W tym przypadku ważne są uprawnienia do wykonywania i lokalizacja skryptu
- Podanie interpretera jako polecenia i skryptu jako argumentu. W ten sposób skrypt będzie służył jako plik wejściowy do interpretera.
- Pozyskiwanie pliku. Znak
. filename.shlub source filename.shsprawi, że skrypt będzie traktowany tak, jakby był wprowadzany z klawiatury, tj. Tak, jakby był wpisany bezpośrednio w linii poleceń. W tym przypadku uprawnienia do wykonywania i lokalizacja nie mają znaczenia
Przykłady
Przykład 1, działający z tłumaczem, w celu wykonania uprawnień
$-> ls -l abc.py
-rw-rw-r-- 1 xieerqi xieerqi 44 Apr 27 22:39 abc.py
$-> python abc.py
a
b
c
Przykład # 2, działający z ./zestawem uprawnień do plików wykonywalnych, zestaw linii shebang.
$-> cat abc.py
#!/usr/bin/env python
for letter in 'a' 'b' 'c' :
print letter
$-> ls -l abc.py
-rwxrwxr-x 1 xieerqi xieerqi 66 Apr 27 23:02 abc.py*
$-> ./abc.py
a
b
c
Przykład # 3, działanie bez zestawu linii shebang (kończy się niepowodzeniem, ponieważ bash nie może odczytać skryptów w języku Python; żadna linia shebang nie przyjmuje bieżącej powłoki jako interpretera)
$-> cat abc.py
for letter in 'a' 'b' 'c' :
print letter
$-> ./abc.py
./abc.py: 2: ./abc.py: Syntax error: word unexpected (expecting "do")
Przykład # 4, uruchamianie skryptu, który ma uprawnienia do wykonywania ustawia folder formularza, który jest częścią $PATHzmiennej
# /home/xieerqi/bin is part of my path variable
$-> echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/opt/microchip/xc16/v1.25/bin:/opt/microchip/xc32/v1.40/bin:/opt/microchip/xc8/v1.35/bin:/home/xieerqi/bin:/home/xieerqi/bin/sh
$-> # current directory is /home/xieerqi
$-> pwd
/home/xieerqi
$-> # move the file to ~/bin
$-> mv ~/abc.py ~/bin/abc.py
$-> # now I can run it just by calling the name
$-> abc.py
/home/xieerqi/bin/abc.py: 2: /home/xieerqi/bin/abc.py: Syntax error: word unexpected (expecting "do")
$-> # Syntax error because again, no interpreter specified.
$-> # must add #!/usr/bin/env python
$-> vi /home/xieerqi/bin/abc.py
$-> # after adding the line with vi text editor, we can run
$-> abc.py
a
b
c
Przykład # 5, usuwanie rozszerzenia, nadal działa, ponieważ rozszerzenia nie mają znaczenia, ale mają uprawnienia i są częścią $PATH:
$-> mv ~/bin/abc.py ~/bin/abc
$-> abc
a
b
c
.shjako rozszerzenia jest w wielu okolicznościach uważane za złą praktykę: jest sprzeczne z nazwą innych poleceń (nie uruchamiaszls.elf), często wprowadza w błąd (jeśli zacznieszfoo.shod#!/bin/bash, to uruchomieniesh foo.shuruchomi go z innym interpreterem niż dla ), a jeśli przerobiszfoo.shprogram na Python, użycie tego rozszerzenia oznacza, że musisz wybrać między zachowaniem wprowadzającej w błąd nazwy a przepisaniem każdego programu, który ją wywołuje.