Вы можете использовать метод 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;
});
});
«Проблема» на самом деле заключается в том, что вы используете и не выполняете сценарий. Когда вы отправляете файл, его содержимое будет выполняться в текущей оболочке, вместо того, чтобы размножать подоболочку. Таким образом, все, включая выход, повлияет на текущую оболочку.
Вместо использования exit
вы захотите использовать return
.
Правильно, что сценарии с исходными текстами и исполняемыми сценариями используют 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 $ | (окно терминала остается открытым и принимает дополнительный вход)
blockquote>Это может быть полезно для быстрого тестирования изменений сценария в одном терминале, сохраняя при этом кучу кода скрапа под основным
exit
/return
пока вы работаете. Это также может сделать код более переносимым в некотором смысле (если у вас есть множество сценариев, которые могут или не могут быть вызваны по-разному), хотя это гораздо менее неудобно использоватьreturn
иexit
там, где это необходимо.
Также обязательно верните с ожидаемым возвращаемым значением. Если вы используете exit, когда будете сталкиваться с выходом, он выйдет из вашей базовой оболочки, так как источник не создает другой процесс (экземпляр).
Я думаю, что это происходит из-за того, что вы запускаете его в режиме источника с точкой
. myscript.sh
. Вы должны запустить это в подоболочке:
/full/path/to/script/myscript.sh
'source' http://ss64.com/bash/source.html
. 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
.
, если у вашего эмулятора терминала нет -hold
, вы можете дезинфицировать сценарий с исходным кодом и удерживать терминал с помощью:
#!/bin/sh
sed "s/exit/return/g" script >/tmp/script
. /tmp/script
read
, в противном случае вы можете использовать $TERM -hold -e script
1) выход 0 выйдет из сценария, если он успешный.
2) выход 1 выйдет из сценария, если это сбой.
Вы можете попробуйте эти два выше, основываясь на ur req.
Это похоже на то, что вы положили функцию 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, это проблема дизайна.
Вместо запуска кода с помощью . run2.sh
вы можете запустить скрипт с помощью sh run2.sh
или bash run2.sh
. Новый экземпляр будет открыт для запуска скрипта, после чего он будет закрыт в конце скрипта, оставив другую оболочку открыт. `
runs.sh
. @Ruakh имеет лучший ответ на этот вопрос. – MikeSchinkel 28 August 2016 в 17:08sh <script>
илиbash <script>
, если вы хотите запустить скрипт и в какой-то момент прекратить – peter 24 August 2017 в 20:00