2016-07-29 7 views
-1

Я подготовил сценарий оболочки для запуска файла Java. Я дал путь Java, путь к нему и зависимости. Я выполняю файл на основе условия.Выполнение сценария оболочки Linux

Ниже приведен фрагмент кода. Код запускается, но элемент управления не выходит из запроса.

CMD=""$JRE_BIN_PATH/java" $SP -cp $CP org.aditya.test.MainClass "[email protected]"" 

if [ "$1" == 'server' ] && [ "$2" == 'start' ] 
then 
$CMD & 
elif [ "$1" == 'process' ] 
then 
$CMD & 
else 
$CMD 
fi 

Команда зависает при if и elif выполняется, так как он использует «&» в конце. Но если управление переходит в другое (без «&»), управление немедленно выходит. Я удалил «&», и все работает отлично. Мой вопрос здесь в том, что такое использование «&» в конце CMD. Почему это вызывает проблему.

+0

'CMD = "" $ JRE_BIN_PATH/java "$ SP -cp $ CP org.aditya.test.MainClass" $ @ "" '- цитирование в оболочке не работает, как будто вы думаете, что это так. Эти посторонние двойные кавычки aren 't превращая его в значение CMD. – davmac

+2

Возможный дубликат [В bash, почему команды оболочки игнорируют кавычки в аргументах, когда аргументы передаются им как переменная?] (http://stackoverflow.com/questions/12136948/in-bash-why-do-shell-commands-ignore-quotes-in-arguments-when-the-arguments-are) – tripleee

+0

Также http://mywiki.wooledge.org/BashFAQ/050 – tripleee

ответ

1

В основном, & - это маркер оболочки Linux для «запуска в фоновом режиме». Задача будет немедленно вилка, а затем вернуться. Он не будет обращаться к стандартным вводам и выводам родительского процесса.

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

+0

Некоторые из заявлений, которые вы делаете здесь, не совсем корректны. «Он не будет обращаться к стандартным входам и выводам родительского процесса» - даже не уверен, что вы подразумеваете под этим, но дочерний процесс, безусловно, все еще наследует эти дескрипторы файлов и может писать на тот же выходной канал, что и родительский процесс. «Вы никогда не должны использовать & для задач, требующих ввода пользователя» - в скрипте, это, вероятно, более или менее верно, но в целом, это хорошо, чтобы создать процесс, требующий ввода пользователем; вам, конечно же, нужно будет выделить его, чтобы обеспечить ввод. – davmac

+0

Вы частично правы: он наследует stdout/stderr, но не stdin. –

+0

Опять же, это неверно. Это, безусловно, наследует stdin. – davmac

Смежные вопросы