Ключовий момент у цьому: розширення не мають значення в будь-якій системній системі Unix. Ім'я файлу - це лише ім'я та не впливає на те, чи може запускатися сценарій чи компільований виконуваний файл . Програміст може додати .shрозширення, щоб вказати, що файл - це сценарій оболонки або .pyсценарій python, але на відміну від Windows, будь-який unix не має значення для імен, він піклується про дозволи.
Важливим є дозвіл на виконання файлу, наданий файлу. Яке ви можете перевірити
ls -l /path/to/file
Запуск виконуваних файлів
Для запуску сценарію зазвичай існує кілька способів.
- Якщо ваш поточний каталог такий же, як і сценарій, а сценарій має виконавчі права, ви можете запустити його так
./my_script_name. Каталог .засобів поточного каталогу.
- Якщо ваш поточний каталог інший і сценарій має виконавчі права, ви можете запустити його, вказавши повний шлях:
/home/user/bin/my_script_name
(Наведені вище два способи покладаються на встановлення виконавчого дозволу; неважливо, чи файл є частиною $PATHзмінної, не має значення. Присутність #!рядка також має значення; без нього сценарій буде виконуватися поточною оболонкою, яку ви відкрили. Якщо у мене є cshсценарій без цього рядка, і спробуйте запустити його в bash з ./my_script.csh, він не вдасться)
- Якщо ваш скрипт знаходиться в каталозі, який є частиною вашої
$PATHзмінної, ви можете запустити його, просто зателефонувавши до імені. Ви можете викликати chmodкоманду в командному рядку, просто ввівши її ім'я, оскільки це в /binпапці. /binзавжди є частиною $PATHзмінної. У цьому випадку виконувані права доступу та розташування сценарію мають значення
- Вказання інтерпретатора як команди та сценарію як аргументу. Таким чином скрипт буде слугувати вхідним файлом для перекладача.
- Пошук файлу.
. filename.shАбо source filename.shзробить скрипт буде розглядатися як якщо б це було введення з клавіатури, тобто , як якщо б воно було надруковано в командному рядку безпосередньо. У цьому випадку виконавчі дозволи та місцезнаходження не мають значення
Приклади
Приклад №1, що працює з інтерпретатором, для виконання дозволів
$-> ls -l abc.py
-rw-rw-r-- 1 xieerqi xieerqi 44 Apr 27 22:39 abc.py
$-> python abc.py
a
b
c
Приклад №2, працює з ./набором дозволів на виконання, набором рядків 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
Приклад №3, працює без набору рядків shebang (не вдається, оскільки bash не може читати сценарії python; жодна лінія shebang не приймає поточну оболонку в якості інтерпретатора)
$-> cat abc.py
for letter in 'a' 'b' 'c' :
print letter
$-> ./abc.py
./abc.py: 2: ./abc.py: Syntax error: word unexpected (expecting "do")
Приклад №4, запущений скрипт, який має виконавчі дозволи, встановлені папкою форми форми, яка є частиною $PATHзмінної
# /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
Приклад №5, видалення розширення все ще працює, оскільки розширення не мають значення, але вони мають дозволи та є частиною $PATH:
$-> mv ~/bin/abc.py ~/bin/abc
$-> abc
a
b
c
.shв якості розширення в багатьох обставинах вважається поганою практикою: це всупереч тому, як називаються інші команди (ви не запускаєтеls.elf), це часто вводить в оману (якщо виfoo.shпочинаєте з#!/bin/bash, тоді запускsh foo.shбуде запускати його з іншим інтерпретатором, ніж для нього створено ), і якщо ви переписуєтесяfoo.shна програму Python, використання цього розширення означає, що вам потрібно вибрати між збереженням оманливого імені та перезаписом кожної програми, яка його викликає.