Выйдите из команды с кодом 1, не закрывая окно терминала [duplicate]

Вы можете использовать метод ajaxSubmit следующим образом :), когда вы выбираете файл, который нужно загрузить на сервер, форма должна быть отправлена ​​на сервер:)

$(document).ready(function () {
    var options = {
    target: '#output',   // target element(s) to be updated with server response
    timeout: 30000,
    error: function (jqXHR, textStatus) {
            $('#output').html('have any error');
            return false;
        }
    },
    success: afterSuccess,  // post-submit callback
    resetForm: true
            // reset the form after successful submit
};

$('#idOfInputFile').on('change', function () {
    $('#idOfForm').ajaxSubmit(options);
    // always return false to prevent standard browser submit and page navigation
    return false;
});
});
139
задан Richard 9 March 2012 в 23:04
поделиться

10 ответов

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

Вместо использования exit вы захотите использовать return.

191
ответ дан Dominik Honnef 22 August 2018 в 06:46
поделиться
  • 1
    Вот еще одно объяснение, которое я нашел полезным: askubuntu.com/a/53179/148337 – 3cheesewheel 26 July 2013 в 20:51
  • 2
    Хотя это правильно, это не отличный ответ. Он игнорирует, что вызывающий скрипт может объявлять переменные или функции, к которым должен обращаться доступ к скрипту. Лучше объяснить, как установить код возврата, а затем обработать его в runs.sh. @Ruakh имеет лучший ответ на этот вопрос. – MikeSchinkel 28 August 2016 в 17:08
  • 3
    Что делать, если функция является вложенным вызовом? то есть вызовы b, b вызывает c, c хочет немедленно выйти из a и b. – Michael 8 September 2016 в 22:00
  • 4
    Источник почти такой же, как копирование. Лучше использовать sh <script> или bash <script>, если вы хотите запустить скрипт и в какой-то момент прекратить – peter 24 August 2017 в 20:00

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

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

Следующий пример может быть запущен прямо как foo.sh или получен как . foo.sh / source foo.sh. В любом случае он будет держать сессию открытой после «выхода». Строка $@ передается так, чтобы функция имела доступ к аргументам внешнего скрипта.

#!/bin/sh
foo(){
    read -p "Would you like to XYZ? (Y/N): " response;
    [ $response != 'y' ] && return 1;
    echo "XYZ complete (args $@).";
    return 0;
    echo "This line will never execute.";
}
foo "$@";

Результат терминала:

$ foo.sh $ Хотели бы вы к XYZ? (Y / N): n $. foo.sh $ Хотели бы вы XYZ? (Y / N): n $ | (окно терминала остается открытым и принимает дополнительный вход)

Это может быть полезно для быстрого тестирования изменений сценария в одном терминале, сохраняя при этом кучу кода скрапа под основным exit / return пока вы работаете. Это также может сделать код более переносимым в некотором смысле (если у вас есть множество сценариев, которые могут или не могут быть вызваны по-разному), хотя это гораздо менее неудобно использовать return и exit там, где это необходимо.

1
ответ дан Beejor 22 August 2018 в 06:46
поделиться

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

0
ответ дан coder23 22 August 2018 в 06:46
поделиться

Я думаю, что это происходит из-за того, что вы запускаете его в режиме источника с точкой

. myscript.sh

. Вы должны запустить это в подоболочке:

/full/path/to/script/myscript.sh

'source' http://ss64.com/bash/source.html

2
ответ дан JBoy 22 August 2018 в 06:46
поделиться
  • 1
    Вам не нужен полный путь к скрипту, если . myscript.sh работает. В лучшем случае вам может понадобиться ./myscript.sh. – Álvaro González 12 August 2014 в 12:05

Да; вы можете использовать return вместо exit. Его основная цель - вернуться из функции оболочки, но если вы используете ее в скрипте source -d, она вернется из этого сценария.

Как и sect; 4.1 «Встроенные оболочки Bourne», Справочного руководства Bash помещает его:

     return [n]

Вызывает выход из функции оболочки с возвращаемым значением n . Если параметр n не указан, возвращаемым значением является статус выхода последней команды, выполняемой в этой функции. Это также можно использовать для завершения выполнения скрипта, выполняемого с помощью встроенного . (или source), возвращающего либо n , либо статус выхода последней команды, выполняемой в скрипте, как статус выхода скрипта. Любая команда, связанная с ловушкой RETURN, выполняется до того, как выполнение возобновится после функции или скрипта. Статус возврата не равен нулю, если return используется вне функции, а не во время выполнения скрипта . или source.

30
ответ дан ruakh 22 August 2018 в 06:46
поделиться

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

#!/bin/sh
sed "s/exit/return/g" script >/tmp/script
. /tmp/script
read

, в противном случае вы можете использовать $TERM -hold -e script

0
ответ дан technosaurus 22 August 2018 в 06:46
поделиться

1) выход 0 выйдет из сценария, если он успешный.

2) выход 1 выйдет из сценария, если это сбой.

Вы можете попробуйте эти два выше, основываясь на ur req.

-2
ответ дан Teja 22 August 2018 в 06:46
поделиться

Это похоже на то, что вы положили функцию run внутри вашего скрипта run2.sh. Вы используете код выхода внутри run, а источник - файл run2.sh в bash tty. Если дать функции запуска его полномочия для выхода из вашего скрипта и дать run2.sh его полномочия для выхода из терминатора. Тогда, поскольку функция запуска имеет силу, чтобы выйти из вашего темпера.

    #! /bin/sh
    # use . run2.sh

    run()
    {
        echo "this is run"
        #return 0
        exit 0
    }

    echo "this is begin"
    run
    echo "this is end"

В любом случае, я одобряю Kaz, это проблема дизайна.

2
ответ дан Umae 22 August 2018 в 06:46
поделиться

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

11
ответ дан Viorel Mirea 22 August 2018 в 06:46
поделиться
  • 1
    Если да, то почему второй параметр sh "." run2.sh? – H0WARD 4 November 2015 в 18:01
  • 2
    @ H0WARD Ты прав, я забыл удалить точки. Теперь я отредактировал ответ. – Viorel Mirea 4 November 2015 в 20:43
  • 3
    OP явно указывает источник как требование. – Jonathan Neufeld 15 December 2016 в 23:32
0
ответ дан Tzunghsing David Wong 5 November 2018 в 04:35
поделиться
Другие вопросы по тегам:

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