it-swarm-ru.tech

Как запустить скрипт Shell на консоли Unix или Mac?

Я знаю это, забудь об этом и заново изучи. Время записать это.

483
P-A

Чтобы запустить неисполняемый скрипт sh, используйте:

sh myscript

Чтобы запустить неисполняемый скрипт bash, используйте:

bash myscript

Запустить исполняемый файл (любой файл с разрешением на выполнение); вы просто указываете его по пути:

/foo/bar
/bin/bar
./bar

Чтобы сделать скрипт исполняемым, дайте ему необходимое разрешение:

chmod +x bar
./bar

Когда файл является исполняемым, kernel отвечает за выяснение того, как его выполнить. Для недвоичных файлов это делается путем просмотра первой строки файла. Он должен содержать hashbang:

#! /usr/bin/env bash

Hashbang сообщает ядру, какую программу запустить (в этом случае команда /usr/bin/env запускается с аргументом bash). Затем сценарий передается программе (в качестве второго аргумента) вместе со всеми аргументами, которые вы указали сценарию в качестве последующих аргументов.

Это означает, что каждый исполняемый скрипт должен иметь хеш-банг . Если это не так, вы не говорите ядру, что это is, и поэтому ядро ​​не знает, какую программу использовать для его интерпретации. Это может быть 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, hashbang может иметь один аргумент . В этом случае мы используем bash в качестве аргумента программы env. Это означает, что у нас нет места для передачи аргументов в bash. Так что нет способа конвертировать что-то вроде #!/bin/bash -exu в эту схему. Вы должны будете поставить set -exu после хеш-бенга.

Этот подход также имеет еще одно преимущество: некоторые системы могут поставляться с /bin/bash, но пользователю может не понравиться этот код, он может обнаружить, что он содержит ошибки или устарел, и, возможно, установил свою собственную bash где-то еще. Это часто имеет место в OS X (Mac), где Apple поставляет устаревший /bin/bash, и пользователи устанавливают обновленный /usr/local/bin/bash, используя что-то вроде Homebrew. Когда вы используете подход env, который выполняет поиск PATH, вы учитываете предпочтения пользователя и используете его предпочтительный bash по сравнению с тем, который поставлялась его системой.

895
lhunath

Чтобы запустить Shell-скрипт 'file.sh':

sh file.sh

bash file.sh

Другой вариант - установить разрешение на выполнение с помощью команды chmod:

chmod +x file.sh

Теперь запустите файл .sh следующим образом:

./file.sh
76
P-A

Для Bourne Shell:

sh myscript.sh

Для Баш:

bash myscript.sh
13
anon

Если вы хотите, чтобы скрипт выполнялся в текущей оболочке (например, вы хотите, чтобы он мог влиять на ваш каталог или среду), вы должны сказать:

. /path/to/script.sh

или же 

source /path/to/script.sh

Обратите внимание, что /path/to/script.sh может быть относительным, например, . bin/script.sh запускает script.sh в каталоге bin в текущем каталоге.

10
Chas. Owens

Расширение файла .command назначено Terminal.app. Двойной щелчок на любом файле .command запустит его.

0
benwiggy

Сначала дайте разрешение на исполнение: -
chmod +x script_name 

  1. Если скрипт не является исполняемым: -
    Для запуска файла сценария sh: -
    sh script_name
    Для запуска файла сценария bash: -
    bash script_name
  2. Если скрипт исполняемый: -
    ./script_name

NOTE: - вы можете проверить, является ли файл исполняемым или нет, используя 'ls -a'

0
Vineet Jain