Как запустить оболочку script на консоли Unix или на Mac?

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

Ответ 1

Для запуска неисполняемого sh script используйте:

sh myscript

Для запуска неисполняемого bash script используйте:

bash myscript

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

/foo/bar
/bin/bar
./bar

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

chmod +x bar
./bar

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

#! /usr/bin/env bash

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

Это означает, что каждый script, который является исполняемым, должен иметь hashbang. Если это не так, вы не говорите ядру, что это такое, и поэтому ядро ​​не знает, какую программу использовать для его интерпретации. Это может быть bash, perl, python, sh или что-то еще. (На самом деле ядро ​​часто использует оболочку пользовательского по умолчанию для интерпретации файла, что очень опасно, потому что это может быть не совсем правильный интерпретатор, или он может анализировать некоторые из них, но с тонкими поведенческими различиями, такими как случай между sh и bash).

Заметка о /usr/bin/env

Чаще всего вы увидите хеш-бэги:

#!/bin/bash

В результате ядро ​​запускает программу /bin/bash для интерпретации script. К сожалению, bash не всегда отправляется по умолчанию, и он не всегда доступен в /bin. В то время как на машинах Linux обычно есть ряд других машин POSIX, где bash отправляется в разных местах, таких как /usr/xpg/bin/bash или /usr/local/bin/bash.

Чтобы написать переносимый bash script, поэтому мы не можем полагаться на жесткое кодирование местоположения программы bash. POSIX уже имеет механизм для борьбы с этим: PATH. Идея состоит в том, что вы устанавливаете свои программы в один из каталогов, находящихся в PATH, и система должна иметь возможность находить вашу программу, когда вы хотите запустить ее по имени.

К сожалению, вы не можете просто сделать это:

#!bash

Ядро не будет (некоторые могут) выполнить поиск PATH для вас. Существует программа, которая может выполнить поиск PATH для вас, но называется env. К счастью, почти все системы имеют программу env, установленную в /usr/bin. Поэтому мы запускаем env с помощью жестко заданного пути, который затем выполняет поиск PATH для bash и запускает его так, чтобы он мог интерпретировать ваш script:

#!/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 по сравнению с тем, с которым была отправлена ​​его система.

Ответ 2

Чтобы запустить оболочку script 'file.sh':

sh file.sh

bash file.sh

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

chmod +x file.sh

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

./file.sh

Ответ 3

Для оболочки bourne:

sh myscript.sh

Для bash:

bash myscript.sh

Ответ 4

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

. /path/to/script.sh

или

source /path/to/script.sh

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

Ответ 5

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

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

ПРИМЕЧАНИЕ: - вы можете проверить, является ли файл исполняемым или нет, используя 'ls -a'

Ответ 6

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

Ответ 7

Небольшое дополнение, чтобы запустить интерпретатор из той же папки, все еще используя #! Hashbang в скриптах.

Например, исполняемый файл php7.2, скопированный из /usr/bin, находится в папке вдоль сценария приветствия.

#!./php7.2
<?php

echo "Hello!"; 

Чтобы запустить его:

./hello

Которые ведут себя так же, как:

./php7.2 hello