Відповіді:
Для запуску невиконаного sh
сценарію використовуйте:
sh myscript
Для запуску невиконаного bash
сценарію використовуйте:
bash myscript
Запустити виконуваний файл (який є будь-яким файлом з дозволом на виконання); ви просто вкажіть його своїм шляхом:
/foo/bar
/bin/bar
./bar
Щоб зробити сценарій виконуваним, надайте йому необхідний дозвіл:
chmod +x bar
./bar
Коли файл виконується, ядро відповідає за з'ясування способів його виконання. Для бінарних файлів це робиться, переглядаючи перший рядок файлу. Він повинен містити hashbang
:
#! /usr/bin/env bash
Хешбанг повідомляє ядро, яку програму запустити (у цьому випадку команда /usr/bin/env
виконується з аргументом bash
). Потім сценарій передається програмі (як другий аргумент) разом з усіма аргументами, які ви дали сценарію, як наступні аргументи.
Це означає, що кожен виконуваний сценарій повинен мати хешбанг . Якщо цього немає, ви не повідомляєте ядро, що воно таке , і тому ядро не знає, яку програму використовувати для його інтерпретації. Це може бути bash
, perl
, python
, sh
, або що - то ще. (Насправді ядро часто використовує оболонку користувача за замовчуванням для інтерпретації файлу, що дуже небезпечно, оскільки воно може бути зовсім не правильним інтерпретатором, або можливо, зможе проаналізувати його частину, але з тонкими поведінковими відмінностями, такими як відмінок між sh
і bash
).
/usr/bin/env
Найчастіше ви побачите хеш-чубок на зразок такого:
#!/bin/bash
Результат полягає в тому, що ядро запустить програму /bin/bash
для інтерпретації сценарію. На жаль, bash
не завжди постачається за замовчуванням, і він не завжди доступний у /bin
. У той час як на машинах Linux це зазвичай є, існує ряд інших машин POSIX, де розміщуються bash
в різних місцях, наприклад, /usr/xpg/bin/bash
або /usr/local/bin/bash
.
Щоб написати портативний скрипт bash, ми не можемо розраховувати на жорстке кодування місця розташування bash
програми. POSIX вже має механізм для вирішення , що: PATH
. Ідея полягає в тому, що ви встановлюєте свої програми в одному з каталогів, які є, PATH
і система повинна мати змогу знайти вашу програму, коли ви хочете запустити її по імені.
На жаль, ви не можете просто зробити це:
#!bash
Ядро не буде (дехто може) PATH
шукати вас. Існує програма, яка може здійснити PATH
пошук для вас, хоча вона називається env
. На щастя, майже у всіх системах встановлена env
програма /usr/bin
. Тож ми починаємо env
використовувати жорстко закодований шлях, який потім здійснює PATH
пошук bash
і запускає його, щоб він міг інтерпретувати ваш сценарій:
#!/usr/bin/env bash
Цей підхід має один недолік: Згідно з POSIX, хешбанг може мати один аргумент . У цьому випадку ми використовуємо bash
як аргумент env
програмі. Це означає, що нам не залишається місця для передачі аргументів bash
. Тому немає можливості перетворити щось подібне #!/bin/bash -exu
до цієї схеми. set -exu
Замість цього вам доведеться поставити хешбанг.
Цей підхід також має ще одну перевагу: деякі системи можуть поставлятися з пристроєм /bin/bash
, але користувачеві це може не сподобатися, він може виявити, що він баггі чи застарів, і, можливо, його встановили bash
десь ще. Це часто трапляється в OS X (Macs), де Apple надсилає застарілі, /bin/bash
а користувачі встановлюють сучасні програми, /usr/local/bin/bash
використовуючи щось на зразок Homebrew. Коли ви використовуєте env
підхід, який здійснює PATH
пошук, ви враховуєте перевагу користувача та використовуєте його переважний баш над тим, з яким постачається його система.
zsh
як свою оболонку, чи використовую я hashbang
#! /usr/bin/env zsh
?
#! /usr/bin/env zsh
якщо (і лише якщо) код всередині сценарію повинен виконуватись оболонкою Z.
Для оболонки бурна:
sh myscript.sh
Для баш:
bash myscript.sh
Якщо ви хочете, щоб сценарій запускався в поточній оболонці (наприклад, ви хочете, щоб він міг впливати на ваш каталог або оточення), слід сказати:
. /path/to/script.sh
або
source /path/to/script.sh
Зверніть увагу , що /path/to/script.sh
може бути відносним, наприклад , . bin/script.sh
біжить script.sh
в bin
директорії в поточній директорії.
Спочатку дайте дозвіл на виконання: -
chmod +x script_name
sh script_name
bash script_name
./script_name
ПРИМІТКА . -Ви можете перевірити, чи файл виконується чи ні, використовуючи "ls -a"
Невелике доповнення, щоб запустити інтерпретатора з тієї ж папки, все ще використовуючи #! Hashbang у скриптах.
Наприклад, виконуваний файл php7.2, скопійований з / usr / bin, знаходиться у папці разом із привітальним сценарієм.
#!./php7.2
<?php
echo "Hello!";
Щоб запустити його:
./hello
Які поводяться так само, як:
./php7.2 hello