Я знаю это, забудьте об этом и снова заново зачитайте его. Время записать его.
Как запустить оболочку 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