Как выполнить сценарий bash в Терминале?

108

У меня есть сценарий bash, например:

#!/bin/bash

echo Hello world!

Как мне выполнить это в Терминале?

Баллон
источник
27
Есть ли у него права на выполнение? Попробуй chmod +x scriptnameа потом ./scriptname.
dirkgently 01

Ответы:

49

$prompt: /path/to/scriptи нажмите Enter. Обратите внимание, что вам необходимо убедиться, что у сценария есть разрешения на выполнение.

блудница
источник
1
Если вы уже находитесь в /path/to каталоге, например, с помощью cd /path/toкоманды, вы можете ввести ./scriptдля запуска вашего скрипта. Не забудьте, в этом случае './' перед 'скриптом'
FrViPofm
120

Еще один способ выполнить его (на этот раз без установки разрешений на выполнение):

bash /path/to/scriptname
Приостановлено до дальнейшего уведомления.
источник
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нигде для его запуска, и очень часто не захочется.
tripleee
24

Вы могли сделать:
sh scriptname.sh

xCra2yx
источник
6
Голос против: это неправильно, если это правильно сценарий Bash.
Tripleee 05
1
Голос за: это нормально для Mac OS X, если ваш сценарий bash находится в том же каталоге
Карл Тейлор,
30
@kot «У меня это работает» очень далеко от «это правильный ответ». Он может работать, если shэто символическая ссылка bashили если в сценарии не используются какие-либо конструкции, специфичные для Bash. В первом случае использование bashвместо shявляется единственным правильным переносимым решением; в последнем случае это неправильный ответ на этот конкретный вопрос, потому что OP спрашивал о совете специально для сценария Bash. Совершение неправильного ответа безответственно; пользователи, которые не понимают разницы, часто пишут здесь, и им нужно показать, почему этот ответ «сработал для меня» не сработал для них.
tripleee
@kraftydevil тоже ^ Одна из нескольких популярных повторяющихся целей по этой теме: stackoverflow.com/questions/5725296/…
tripleee
5
@kot Повторяю: бывают ситуации, когда это работает (как вы уже выяснили), но в общем случае это неправильный ответ на вопрос в заголовке. По крайней мере, этот ответ должен объяснить условия, в которых он работает; но я предлагаю просто удалить этот ответ.
tripleee
14

Во-первых, вы должны сделать его исполняемым, используя: chmod +x name_of_your_file_script .

После того, как вы сделали его исполняемым, вы можете запустить его, используя ./same_name_of_your_file_script

Дональд Шахини
источник
10

Измените свой каталог туда, где находится скрипт , используя cd команду

Затем введите

bash program-name.sh
gaurav07
источник
6
В этом нет необходимости cd; в качестве аргумента вы можете указать произвольно сложный путь bash; действительно, любая программа, которая принимает аргумент имени файла, работает таким образом (или ужасающе, ошеломляюще сломана).
tripleee
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, оно является частью имени сценария, и вы должны включить его.
    • Используйте shebang , который, как я вижу, у вас есть ( #!/bin/bash) в вашем примере. Если это первая строка вашего скрипта, система будет использовать эту программу для выполнения скрипта. Нет необходимости набирать программы или использовать расширения.
    • Используйте «портативный» шебанг . Вы также можете сделать так, чтобы система выбрала версию программы, которая находится первой в PATHсписке, используя, #!/usr/bin/envа затем имя программы (например, #!/usr/bin/env bashили #!/usr/bin/env python3). Есть плюсы и минусы , как тщательно обсуждается здесь .
Майкл Трианор
источник
1
Довольно хорошее резюме. Возможно, в последнем примере напомните людям, что script.shи script.phpявляются буквальными именами файлов этих сценариев, и что если вы добавите расширение в имя файла, вам нужно будет включить его при запуске сценария (и наоборот; если сценарий не нет расширения, не ставьте его). Это не похоже на, например, DOS, где вы могли опустить .batили в .exeимени файла, а файлы должны были иметь расширение из небольшого набора, чтобы считаться исполняемыми.
tripleee
1
Другой новичок распространенной ошибкой является непонимание разницы между path, /path, ./pathи ~/path. Думаю, вы, вероятно, не хотите здесь объяснять, но, возможно, ссылка на объяснение, например ... о, черт, я должен был опубликовать это.
tripleee
1

И еще один способ

. /path/to/script

Что означает точка?

Ешьте в Джо
источник
Это выполняет сценарий в текущей оболочке, которую необходимо вызвать. Это не то, чего ожидает большинство людей, когда вы просто запускаете сценарий. Это может иметь побочные эффекты в вашей существующей среде.
Инженер-программист
-2

Если вы находитесь в каталоге или папке, где доступен файл сценария, просто измените права доступа к файлу в исполняемом режиме, выполнив

chmod +x your_filename.sh

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

$ sudo ./your_filename.sh

Над "." представляют текущий каталог. Заметка! Если вы не находитесь в каталоге, в котором находится файл сценария bash, вы меняете каталог, в котором находится файл, используя

cd Directory_name/write the complete path

команда. В противном случае ваш скрипт не сможет работать.

Хасан Шамшир
источник
Надеюсь, что все сделают это, потому что я упоминаю все связанные концепции этой конкретной проблемы.
Хасан Шамшир
Как объясняется в других ответах здесь, sudoэто неправильно и потенциально ужасно неправильно, если вы используете его в ненадежном скрипте, который злоупотребляет полномочиями, которые вы ему без надобности дали.
Tripleee
Совет cdкуда-то непонятен, но, вероятно, тоже неверен.
tripleee