То, почему хижина не заставляет программу разветвляться как он, должно?

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

Править

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

3 ответа

Хижина никогда не заставляет процесс разветвляться. Это ничего не делает, ЕСЛИ сценарий не является исполняемым файлом, и это вызывается в таком далеко, что это заставляет систему оценивать хижину для наблюдения что программу/оболочку выполнить сценарий с.

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

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

chmod +x script

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

./script

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

./script относительный путь в файл сценария, что означает поиск в текущем каталоге находить файл сценария 'сценарием' и затем выполнять его — который работает, только если файл сценария является исполняемым файлом.

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

bash script

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

5
ответ дан 07.12.2019, 22:51

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

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

Как первая строка после хижины:

called=$_

В точке Вы хотите выйти или возвратиться:

[[ $called != $0 ]] && exit || return
6
ответ дан 07.12.2019, 22:51

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

4
ответ дан 07.12.2019, 22:51

Теги

Похожие вопросы