Я знаю это, забудь об этом и заново изучи. Время записать это.
Я знаю это, забудь об этом и заново изучи. Время записать это.
Ответы:
Чтобы запустить неисполняемый sh
скрипт, используйте:
sh myscript
Чтобы запустить неисполняемый bash
скрипт, используйте:
bash myscript
Запустить исполняемый файл (любой файл с разрешением на выполнение); вы просто указываете его по пути:
/foo/bar
/bin/bar
./bar
Чтобы сделать скрипт исполняемым, дайте ему необходимое разрешение:
chmod +x bar
./bar
Когда файл исполняемый, ядро отвечает за выяснение того, как его выполнить. Для недвоичных файлов это делается путем просмотра первой строки файла. Он должен содержать hashbang
:
#! /usr/bin/env bash
Hashbang сообщает ядру, какую программу запустить (в этом случае команда запускается /usr/bin/env
с аргументом bash
). Затем сценарий передается программе (в качестве второго аргумента) вместе со всеми аргументами, которые вы указали сценарию в качестве последующих аргументов.
Это означает, что каждый исполняемый скрипт должен иметь хэш-банг . Если это не так, вы не сообщаете ядру, что это такое , и поэтому ядро не знает, какую программу использовать для его интерпретации. Это может быть 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
после hashbang вместо этого.
Этот подход также имеет еще одно преимущество: некоторые системы могут поставляться с /bin/bash
, но пользователю это может не понравиться, он может обнаружить, что он неисправен или устарел, и, возможно, установил свою собственную в bash
другом месте. Это часто имеет место в OS X (Mac), где Apple поставляет устаревшую версию, /bin/bash
а пользователи устанавливают /usr/local/bin/bash
новейшую версию, используя что-то вроде Homebrew. Когда вы используете env
подход, который выполняет PATH
поиск, вы принимаете во внимание предпочтения пользователя и используете его предпочтительный bash по сравнению с тем, который поставляется с его системой.
zsh
качестве своей оболочки, я бы использовал hashbang
#! /usr/bin/env zsh
?
#! /usr/bin/env zsh
если (и только если) код внутри скрипта должен выполняться оболочкой Z.
Чтобы запустить shell-скрипт 'file.sh':
sh file.sh
bash file.sh
Другой вариант - установить разрешение на выполнение с помощью команды chmod:
chmod +x file.sh
Теперь запустите файл .sh следующим образом:
./file.sh
Для оболочки Борн:
sh myscript.sh
Для Баш:
bash myscript.sh
Если вы хотите, чтобы скрипт выполнялся в текущей оболочке (например, вы хотите, чтобы он мог влиять на ваш каталог или среду), вы должны сказать:
. /path/to/script.sh
или
source /path/to/script.sh
Обратите внимание, что /path/to/script.sh
может быть относительным, например, . bin/script.sh
запускает script.sh
в bin
каталоге в текущем каталоге.
Сначала дайте разрешение на исполнение: -
chmod +x script_name
sh script_name
bash script_name
./script_name
ПРИМЕЧАНИЕ : -вы можете проверить, является ли файл исполняемым или нет, используя 'ls -a'
Небольшое дополнение, чтобы запустить интерпретатор из той же папки, все еще используя #! Hashbang в скриптах.
В качестве примера, исполняемый файл php7.2, скопированный из / usr / bin, находится в папке в сценарии приветствия .
#!./php7.2
<?php
echo "Hello!";
Чтобы запустить это:
./hello
Которые ведут себя так же, как:
./php7.2 hello