Создает ли git bash подоболочку по умолчанию при запуске файла сценария?

#bash #git-bash #exit #subshell

Вопрос:

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

Я знаю, что выход 1 закроет текущую оболочку, в которой она работает. И оператор exit находится в фигурных скобках (это означает, что он выполняется в той же оболочке). Но когда этот скрипт запускается, когда ./testScript.sh он прекращает выполнение test (), TestTwo() не вызывается, и терминал остается открытым.

Хотя это именно та функциональность, которую я ищу, мой вопрос в том, почему он не закрывает терминал из-за команды exit 1;? Создает ли git bash подоболочку по умолчанию при запуске скрипта?

Я знаю, что это не потому, что оно было вызвано внутри функции. Я попытался запустить оператор exit в скрипте без функции, но он все равно не закрывает терминал.

Любая информация о фактической работе git bash и команды выхода была бы очень полезна.

Спасибо!

 # testScript.sh

function test() {
    dotnet build -c Debug sample.csproj || { echo -e "${RED}=== Build Failed";  exit 1; }
}

function testTwo() {
    echo "== executing test two function."
}

function all()
{
    pushd .
  test
  testTwo
    popd
}

all "$@"
 

Комментарии:

1. В вашем сценарии нет никаких проблем. Вы уверены, что можете запустить его как ./testScript.sh ?

2. Сценарии выполняются как дочерние процессы , но это не то же самое, что дочерняя оболочка.

3. Кроме того, кнопка «фрагмент» предназначена только для HTML JavaScript. Используйте {} кнопку для форматирования кода на других языках.

4. В любом случае-поскольку вы используете синтаксис только для bash, это не совсем сценарий sh-это специально сценарий bash; не все копии sh будут его запускать. Действительно, лучше вообще не использовать расширения для имен исполняемых файлов-если вы используете shebang для указания интерпретатора, вы можете изменить этот интерпретатор по желанию без необходимости переименовывать файл и, таким образом, изменять программы, которые его вызывают. См. Также Расширения имени команды, которые считаются вредными .

Ответ №1:

Создает ли git bash подоболочку по умолчанию при запуске скрипта?

Это не «подоболочка», как в ( ) . Оболочка порождает отдельный процесс, который выполняет команду. Процесс не наследует переменные и функции bash, он наследует только экспортированные переменные, т. Е. Это не дочерняя оболочка.

Не используйте function name() , просто name() . Видишь https://wiki.bash-hackers.org/scripting/obsolete . Проверьте сценарии с помощью shellcheck.net .

Комментарии:

1. Спасибо! Да, я заметил, что выполнение создает новые процессы. Таким образом, оператор exit убивает процессы, и тем самым выполнение останавливается, а терминал не закрывается. Но почему бы ему не выполнить вторую функцию, я предполагаю, что она тоже должна быть в новом процессе?

2. m assuming it too should be on a new process? Как подсказывает вам ваше наблюдение, ваше предположение неверно. Функция выполняется в текущей оболочке.

3. @NivedithaKarmegam, будет ли вторая функция выполняться как подпроцесс или нет, не имеет значения, так как сценарий завершается перед его запуском. Когда он завершается, он прекращает выполнение test функции, all сценария, который ее вызвал, и основной последовательности testScript.sh файла.