2

Я всегда объявляю линию Шебанга #!/bin/bash в моем сценарии оболочки. Недавно, когда я вызвал скрипт, содержащий вызов exit , он убил мой терминал. Обычно это убивает разветвленный процесс и возвращается к моему терминалу. Почему могло случиться, что остановило разветвление?

РЕДАКТИРОВАТЬ

$ bash --version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin10.0)
  • Я обычно вызывать сценарий с . script_path или через символическую ссылку на скрипт.

3 ответа3

5

Так как поиск сценария с использованием . заставляет его работать в текущей оболочке, exit вызывает текущую оболочку для выхода. Вы можете использовать return для возврата из исходного сценария, а также из функции. Вы не можете вернуться из сценария, который был запущен напрямую.

Чтобы работать с этими ограничениями, вы можете поставить условный тест в вашем скрипте, чтобы сделать правильные вещи в зависимости от того, был ли он получен или запущен напрямую.

Как первая строка после Шебанга:

called=$_

В том месте, куда вы хотите выйти или вернуться:

[[ $called != $0 ]] && exit || return
5

Шебанг никогда не заставляет процесс раскошелиться.  Он не делает ничего , если скрипт исполняемый и он вызывается таким же , что это приводит к системе оценки хижины , чтобы увидеть , какую программу / оболочку для выполнения сценария с.

Например, если вы уже работали в bash и выполнили сценарий с помощью команды source , сценарий будет выполнен внутри оболочки, которую вы в данный момент выполняете, и exit повлияет на этот процесс оболочки, а не на новый процесс оболочки, который закончился.

Если у вас есть файл сценария, который вы хотите запустить, вы должны сделать его исполняемым с помощью следующей команды:

chmod +x script

Затем, если вы хотите запустить скрипт, и если мы предполагаем, что файл скрипта находится в текущем каталоге, вы используете следующую команду:

./script

Обратите внимание, что это очень отличается от . script , который является просто сокращенной записью для source script .

./script - это относительный путь к файлу сценария, что означает поиск в текущем каталоге, чтобы найти файл сценария «script», а затем выполнить его, что работает только в том случае, если файл сценария является исполняемым.

Если у вас есть файл сценария, который НЕ является исполняемым, вы можете вызвать его с помощью:

bash script

Но в этом случае вы указываете, какую оболочку запускать, а строка shebang игнорируется.

4

Шебанг не заставляет программу работать; зависит от того, выполняется ли сценарий или нет, разветвления процесса. Выбор сценария вызовет его выполнение в текущем интерпретаторе, а использование exec заменит текущий процесс.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .