Как запустить сценарий оболочки на консоли Unix или Mac?

448

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

  • 12
    написание upvote поезда до станции репутации
  • 0
    не собираюсь возражать, просто чтобы восхититься этой удивительной ошибкой, которую ты там совершил!
Теги:
osx

5 ответов

780
Лучший ответ

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

  • 60
    Спасибо, что нашли время написать хороший ответ на простой вопрос.
  • 5
    Если бы я использовал zsh качестве оболочки, я бы использовал hashbang #! /usr/bin/env zsh ?
Показать ещё 7 комментариев
74

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

sh file.sh

bash file.sh

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

chmod +x file.sh

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

./file.sh
  • 0
    ребята tnx помогли мне выучить новую команду
  • 0
    Спасибо, предоставление исполняемого разрешения решило мою проблему :)
11

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

sh myscript.sh

Для bash:

bash myscript.sh
  • 0
    Спасибо за ответ на этот довольно очевидный вопрос. Для такого парня из Mac, как я, легко забыть старые команды Unix между кругами.
10

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

. /path/to/script.sh

или

source /path/to/script.sh

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

  • 6
    Будьте очень осторожны при поиске или расстановке точек с относительными путями. Вы всегда должны начинать их с ./ Если вы этого не сделаете, а относительный путь не содержит косых черт, вы будете искать что-то в PATH, ДО чего-то в текущем каталоге! Очень опасно для злоупотреблений.
0

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню