Як виконати скрипт 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.