Як виконати скрипт bash в Terminal?


108

У мене є сценарій bash, як:

#!/bin/bash

echo Hello world!

Як виконати це в Терміналі?


27
Чи має дозвіл на виконання? Спробуйте chmod +x scriptnameі потім ./scriptname.
— брудно

Відповіді:


49

$prompt: /path/to/scriptі натисніть Enter. Зверніть увагу, що вам потрібно переконатися, що сценарій виконує дозволи.


1
Якщо ви вже знаходитесь в /path/to каталозі, наприклад, за допомогою cd /path/toкоманди, ви можете ввести, ./scriptщоб запустити свій скрипт. Не забудьте, в цьому випадку сценарій './' перед 'скриптом'
— FrViPofm


26

CD в ​​каталог, який містить сценарій, або помістіть його у папку bin, що знаходиться у вашому $ PATH

потім введіть

./scriptname.sh

якщо в одному каталозі або

scriptname.sh

якщо він знаходиться в папці bin.


9
Це буде працювати лише в тому випадку, якщо сценарій встановлений біт виконання. Це, мабуть, потрібно вирішити.
— Брайан Оуклі

./scriptname.shпрацює для мене, але scriptname.shдає scriptname.sh: command not found. -rwxr-xr-xє його дозволами.
— Spikatrix

1
Порада в cdбудь-якому місці взагалі спричиняє чергове непорозуміння для початківців. Якщо сценарій не має внутрішньо залежностей, які вимагають його запуску в певному каталозі (наприклад, необхідність прочитати файл даних, на який сценарій незрозуміло не дає можливості вказувати), вам ніколи не потрібно cdнікуди його запускати, і дуже часто не захоче.
— трійчатка

24

Ви можете зробити:
sh scriptname.sh


6
Downvote: Це неправильно, якщо це правильно сценарій Bash.
— трійчатка

1
Оновлення: Це добре для Mac OS X, якщо ваш скрипт bash знаходиться в одному каталозі
— Karl Taylor

30
@kot "Це трапляється на мене" дуже далеко від "це правильна відповідь". Він може працювати, якщо shце симпосилання на bash, або якщо сценарій не використовує будь-яку структуру, характерну для Баша. У першому випадку використання bashзамість sh- єдине правильне, портативне рішення; в останньому випадку це не правильна відповідь на це конкретне питання, оскільки ОП запитала поради щодо конкретного сценарію Баша. Переслідування неправильної відповіді - безвідповідальне; Користувачі, які не розуміють різницю, часто публікують тут, і мені потрібно показати, чому ця відповідь "працював на мене" не працювала для них.
— трійчатка

@kraftydevil ToO ^ Один з декількох популярних дублюючих цілей по цій темі: stackoverflow.com/questions/5725296 / ...
— tripleee

5
@kot Я повторюю: Є ситуації, коли це працює (як і ви дізналися), але це не правильна відповідь у загальному випадку на питання в заголовку. Принаймні, ця відповідь повинна пояснювати умови, за яких вона працює; але моя пропозиція буде просто видалити цю відповідь.
— трійка

14

Під - перше , ви повинні зробити його виконуваним з допомогою: chmod +x name_of_your_file_script.

Після того як ви зробили його виконуваним, ви можете запустити його за допомогою ./same_name_of_your_file_script


10

Змініть свій каталог на те, де знаходиться сценарій , використовуючи команду cd

Потім введіть

bash program-name.sh

6
cdНікуди не потрібно ; ви можете вказати довільно складну назву шляху як аргумент bash; Дійсно, будь-яка програма, яка приймає аргумент імені файлу, працює таким чином (або жахливо, розумово порушена).
— трійчатка

10

Це стара нитка, але я трапився поперек, і я дивуюсь, що ніхто ще не дав повної відповіді. Тож ось іде ...

Виконання підручника з сценарію командного рядка!

Питання: Як виконати це в Терміналі?

Конфузії та конфлікти:

  • Вам не потрібно "розширення" (наприклад, .sh чи .py чи щось інше), але це допомагає стежити за речами. Це не зашкодить. Якщо ім'я сценарію містить розширення, його потрібно використовувати.
  • Вам не потрібно взагалі перебувати в якомусь певному каталозі з будь-якої причини.
  • Вам не потрібно вводити назву програми, яка запускає файл (BASH або Python чи будь-яку іншу), якщо ви цього не хочете. Це не зашкодить.
  • Вам не потрібно sudoнічого з цього робити. Ця команда зарезервована для запуску команд у якості іншого користувача або "root" (адміністратора) користувача. Чудовий пост тут .

(Людина, яка тільки навчається виконувати сценарії, не повинна використовувати цю команду, якщо немає реальної потреби, наприклад, встановлення нової програми. Гарне місце для розміщення сценаріїв знаходиться у вашій папці ~ / bin. Ви можете потрапити туди введіть cd ~/binабо cd $HOME/binз підказки терміналу. Ви будете мати повні дозволи в цій папці.)

Щоб "виконати цей скрипт" з терміналу в системі типу Unix / Linux, потрібно зробити три речі:

  1. Розкажіть системі про розташування сценарію. (вибрати один)

    • Введіть повний шлях із назвою сценарію (наприклад /path/to/script.sh). Ви можете перевірити повний шлях, ввівши pwdабо echo $PWDв терміналі.
    • Виконати з того самого каталогу та використовувати ./для шляху (наприклад ./script.sh). Легко.
    • Помістіть скрипт в каталог, який знаходиться в системі, PATHі просто введіть ім’я (наприклад script.sh). Ви можете перевірити систему PATH, ввівши echo $PATHабо echo -e ${PATH//:/\\n}якщо ви хочете акуратніше списку.
  2. Скажіть системі, що сценарій має дозвіл на виконання. (вибрати один)

    • Встановіть "біт виконання", ввівши chmod +x /path/to/script.shтермінал.
    • Ви також можете використовувати, chmod 755 /path/to/script.shякщо ви віддаєте перевагу цифрам. Існує велика обговорення з прохолодним графіком тут .
  3. Розкажіть системі тип скрипту. (вибрати один)

    • Введіть назву програми перед сценарієм. (наприклад, BASH /path/to/script.shабо PHP /path/to/script.php) Якщо скрипт має розширення, наприклад .php або .py, він є частиною назви сценарію, і ви повинні включити його.
    • Використовуйте шебанг , який, як я бачу, #!/bin/bashу своєму прикладі є ( ). Якщо у вас це є в якості першого рядка сценарію, система використовуватиме цю програму для виконання сценарію. Не потрібно вводити програми чи використовувати розширення.
    • Використовуйте «портативний» шебанг . Ви також можете змусити систему вибрати версію програми, яка спочатку PATHвикористовується, #!/usr/bin/envпісля чого слід назвати програму (наприклад, #!/usr/bin/env bashабо #!/usr/bin/env python3). Є плюси і мінуси , як ретельно обговорюється тут .

1
Досить хороший підсумок. Може бути , в останньому прикладі нагадати людям , що script.shі script.phpє буквальні імена файлів цих сценаріїв, і що , якщо ви поставите розширення в імені файлу, вам необхідно включити його при запуску сценарію (і навпаки, якщо скрипт Байдуже » не мати розширення, не ставити його). Це не схоже, наприклад, на DOS, де ви можете опустити .batабо .exeвід імені файлу, і файли, необхідні для розширення з невеликого набору, щоб вважати його виконуваним.
— трійчатка

1
Інший новачок поширеною помилкою є нерозуміння різниці між path, /path, ./pathі ~/path. Я думаю, ви, мабуть, не хочете пояснювати це тут, але, можливо, посилання на таке пояснення, як ... о, боже, мені довелося це опублікувати .
— трійчатка

1

І ще один спосіб

. /path/to/script

Яке значення крапки?


Це виконує сценарій у поточній оболонці, яку потрібно викликати. Це не те, що більшість людей очікують, що це станеться, коли ви просто запустите сценарій. Це може мати побічні ефекти для вашого існуючого середовища.
— Програмний інженер

-2

Якщо ви знаходитесь в каталозі чи папці, де доступний файл сценарію, просто змініть дозвіл на файл у виконаному режимі, виконавши це

chmod +x your_filename.sh

Після цього ви запустите скрипт, використовуючи наступну команду.

$ sudo ./your_filename.sh

Над "." представляють поточний каталог. Примітка! Якщо ви не перебуваєте в каталозі, де присутній файл скрипту bash, ви змінюєте каталог, у якому знаходиться файл, використовуючи

cd Directory_name/write the complete path

командування. Інакше ваш сценарій не може працювати.


Сподіваюся, що всі це зроблять, тому що я згадую всю пов'язану з цим концепцію проблему.
— Хасан Шамшир

Як пояснено в інших відповідях тут, sudoце неправильно і, можливо, жахливо неправильно, якщо ви використовуєте його на ненадійному сценарії, який зловживає повноваженнями, які ви йому давали.
— трійчатка

Пораду cdдесь важко зрозуміти, але, ймовірно, також неправильна.
— трійчатка
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.